Mysql學習筆記(四)聊聊數據庫索引

小心情(可直接跳到分割線后)

今天心情好些了。一些濃的化不開的壞情緒,也漸漸的在晚上解決掉一個復雜的邏輯問題后,漸漸消散了。

今天中午去吃飯的時候,坤哥漫不經心的說:’我這么多年終于悟出了一個道理,人年輕的時候不要那么拼命,都沒有時間做其他事情了’

我問什么其他事情,坤哥看了我一眼,又繼續漫不經心的說,那么忙,都沒有時間談戀愛了。

我想不那么拼命可以嘛?房價每年都漲,生活的成本與日俱增。如果不努力讓自己的價值所賺取的金錢,超過經濟增速。那么只能繼續成為一個社會底層的loser,繼續在青春的美好時光,生活在痛苦之中。

唯有努力而已,努力太不夠了,拼命的才夠,才能與別人的比拼中,占得一點先機。

那么努力,很痛苦的,生活也很單調。這樣的生活,又有那個女孩子喜歡呢?

我想近半年來,我的情商、人際交往能力有所下降就與我將全部身心,放在編程上有關。

我本來想用這些話,去和坤哥去聊聊的,但話終于噎在喉嚨間,沒有去說。

每個人都有自己要走的路,或孤獨或熱鬧,都是自己選的。

你在選擇一條道路的時候,必須去拋棄很多東西。

我愿意得到,所以更能下的狠心失去。

?吐槽完畢,正文開始:

?什么事索引呢?容易被專業名詞忽悠的同學請自覺百度看通俗解釋:檢尋圖書資料的一種工具。將書刊中的內容或項目分類摘錄,標明頁數,按一定次序排列,附在一書之后,或單獨編印成冊,以便讀者查閱。舊稱通檢或備檢。也稱引得。

mysql核心技術與最佳實踐》這一個章節講的太棒了,所以今天的內容絕大多數都是提煉總結書中的。

用更簡單的方式理解索引:索引就是新華字典前面的按拼音、按部首查字的那部分。

生活中,查一個生僻字,如果不知道讀音,也不借助與筆畫查找,恐怕很難查得到吧,如果讓機器去做這件事,那就是查閱整本字典的所有字,匹配后返回。這就造成了全表掃描,效率很低。

但是我們通過部首去找,然后通過筆畫,可能查閱的數據量很小,讓機器去做,只掃描相關數據項就好了,速度很快。

因此查詢速度的快慢,和數據量的大小沒有絕對關系,查詢速度取決于取出所需的數據,掃描了多少條表數據。他們的比值越小,效率越高。

幾個比較重要的知識點:

1、MySQL在檢索表中的數據時,先按照索引“關鍵字”的值在索引中進行查找,如果能夠查找的到,則可以直接定位到起始頁,如果沒有,則全表掃描。

?聽著《忘記他》劉惜君的歌,開始總結下面的內容。

2、索引其實就是數據庫表中字段值的復制,改字段稱為索引的關鍵字。

3、一張數據表可以建立多個索引。

4、什么是前綴索引:

? ? 新華字典中的“部首檢字表”的使用方法。首先我們先確認要查找這個字的部首是什么,然后看部首外的字筆畫是多少,然后查找相應的字。同樣對于數據庫表而言,索引中關鍵字的值可以是索引“關鍵字的一部分,這種索引成為”前綴索引”。例如我可以給用戶表中姓名表建立前綴索引。統計姓名中姓張的人數、姓李的人數。

5、索引可以是字段的組合嗎?

? ? 對數據庫而言,索引可以是字段的組合。數據庫表中的某個索引如果有多個關鍵字構成,此時該索引被稱為復合索引。無論索引是一個字段、還是幾個字段的組合。這些字段必須來自同一張表,比昂切關鍵字的值必須是表中相應字段值的copy,。

6、不能跨表建立索引。

7、索引數據需要額外的存儲空間嗎?

? ?這個問題很扯淡,比如想讓牛跑的好,又想讓牛不吃草。索引文件肯定占存儲空間了。對于數據庫表的索引而言,索引關鍵字經過排序后放在外存中。對于MyISAM數據庫表而言,索引存放在外存MYI索引文件中。對于InnoDB存儲引擎而言,索引數據存放在外存InnoDB表空間文件中(可能是共享表空間文件,也可能是獨享表空間文件)。為了提升數據的檢索效率,無論MyISAM表的索引還是,InnoDB的索引,索引的關鍵字經過升序排序后放在外存中。

8、表中那些字段適合選作表的索引?什么事主索引,什么是聚簇索引?

? ?對于MyISAM表而言,MySQL會自動的將表中所有記錄主鍵值的備份以及每條記錄所在的起始頁編入索引中。像部首檢字表一樣生成一張“索引表”存放在外存中,這種索引稱為主索引(primary key)。MyISAM表的MYI索引文件,與MYD數據文件位于兩個文件。通過MYI索引文件中的“表記錄指針”,可以找到MYD數據文件中表記錄所在的物理地址。

Innodb表的“主索引”與MyISAM表的主索引不同。InnoDB表的主索引關鍵字的順序與InnoDB表記錄主鍵值的順序一致。這種索引就稱為“聚簇索引”,并且每一張表只能擁有一個聚簇索引。

9、索引與數據結構是什么關系?

? ?數據庫中的所以關鍵字在索引文件中存儲規則十分復雜。為了有效的提高數據庫檢索效率。索引通常使用平衡樹(btree)或者哈希表等復雜的數據結構進行“編排”。在操作數據庫的時候,底層操作在執行這種復雜的運算,但我們是感覺不到的。

10、索引越多越好嗎?

? ?如果索引過多,在更新數據(添加、修改、刪除)時,除了需要修改表中的數據外,還需要對該表的所有索引進行維護,以維持表字段值和索引關鍵字值的一致性。反而降低了數據的更新速度。

? ?實踐表名,當修改表記錄的操作特別頻繁時,過多的索引會導致硬盤I/O次數明顯增加,反而會明顯的降低服務器性能。甚至可能會導致宕機。

11、索引關鍵字的選取原則。

? ? 原則1、表中的某字段離散度越高,該字段越適合作為選作索引的關鍵字。

? ??數據庫用戶在創建主鍵約束的同時,MySQL會自動的創建主索引(primary index)且索引名為primary ;在創建唯一約束的同時,MySQL會自動創建唯一性約束(unique index)默認情況下,索引名為唯一約束性約束的字段名。

? ? 原則2、占用存儲空間少的字段更適合選作索引的關鍵字。

? ? 原則3、存儲空間固定的字段更適合選作索引的關鍵字。

? ? 原則4、 where字句中經常使用的字段應該創建索引,分組字段或者排序字段應該創建索引,兩個表的連接字段應該創建索引。

? ? ??昨晚,遲遲不能入眠。瀏覽空間的時候,得知朋友要離婚了。她是我大學喜歡的女孩子,當初因為任性等原因,相處了很短一段時間,就分開了。結婚才一年時間,也有了孩子。心突然很心痛,幻想能回到從前。那個星星掛滿天空的夜晚,我倔強而任性,她熱烈而芬芳。算了,還是不要為這些事傷心了,凡人必有命。我還是好好的碼代碼吧。

? ?引入索引的目的是為了提高檢索的效率,因此索引關鍵字的選擇與select語句息息相關。這句話有兩個方面的含義,select語句的設計可以決定索引的設計;索引的設計也同樣影響著select的設計。select語句中的where字句、group by 字句,以及order by字句,又可以影響索引的設計。兩個表的鏈接字段應該創建索引,外鍵約束一經創建,mysql便會自動地創建與外鍵相對應的索引,這是由于外鍵字段通常是兩個表的連接字段。

? ? 原則5、更新頻繁的字段不適合創建索引,不會出現在where字句中的字段不應該創建索引。

? ? 原則6、最左前綴的原則。

? ? 復合索引還有另外一個有點,他通過被稱為“最左前綴”(leftmost prefixing)的概念體現出來,假設向一個表的多個字段(例如 firstName ,lastName、address)創建復合索引(索引名:firstname_lastname_address)。當where查詢的條件是以下各種字段的組合時,mysql將使用fname_lastname_address索引。其他情況將無法使用 ? ? ? ? ?fname_lastname_address索引。

firstname,lastname,address

firstname,;lastname

firstname

? ?原則7、 盡量使用前綴索引。

? ? 僅僅在姓名中的姓氏部分創建索引,從而可以節省索引的存儲空間,提高檢索效率。

? ? 與數據庫的設計一樣,索引的設計同樣需要數據庫開發人員經驗的積累,以及智慧的沉淀,同時需要依據系統各自的特點設計出更好的索引,在“加快檢索效率”與“降低更新速度”之間做好平衡。從而大幅提升數據庫的整體性能。

? ??

索引與約束關系:

? ? ??mysql中的索引與約束的關系是怎樣的。約束分為主鍵約束、唯一性約束、默認值約束、檢查約束、非空約束、以及外鍵約束。其中主鍵約束、唯一性約束、外鍵約束與索引的關系更為緊密。

? ? ??約束主要用于保證業務邏輯操作數據庫時數據庫的完整性。

? ???而索引則是將關鍵字數據以某種數據結構(如btree,及二叉樹,哈希等)存儲到外存,用于提升數據的檢索性能。

? ? ?約束是邏輯層面的概念,而索引既有邏輯上的概念,更是一種物理存儲方式,且事實存在,需要耗費一定的存儲空間。

? ? ?unqiue index ? 索引名 ?唯一索引

? ? ?index ? 索引名 ? ? ?普通索引

? ? ?index ?complex_index(price,publish_time)復合索引

? ? ?本文大部分內容,摘錄于《MySQL核心技術與最佳實踐》,有興趣的朋友可以買這本書看,寫的真是很不錯。

? ? ?

?以上就是Mysql學習筆記(四)聊聊數據庫索引的內容,更多相關內容請關注PHP中文網(www.php.cn)!?

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享