MySQL中,小表該不(bù)該建索引?
發表時(shí)間:2021-1-5
發布人(rén):融晨科技
浏覽次數:58
标題中的(de) 「'對于(yú)非常小的(de)表,大(dà)部分情況下簡單的(de)全表掃描比建立索引更高效'」 ,其實是(shì)問題 「'索引的(de)使用條件'」 的(de)答案的(de)一部分。完整答案是(shì):
對于(yú)非常小的(de)表、大(dà)部分情況下簡單的(de)全表掃描比建立索引更高效 對于(yú)中到(dào)大(dà)型的(de)表,索引就(jiù)非常有效;
那麽爲(wéi / wèi)什麽對于(yú)非常小的(de)表,大(dà)部分情況下簡單的(de)全表掃描比建立索引更高效呢?理由如下:
MySQL的(de)默認存儲引擎是(shì)InnoDB,在(zài)InnoDB中索引是(shì)通過 B+ 樹實現的(de),MySQL的(de)數據是(shì)存儲在(zài)聚簇索引(聚簇索引也(yě)叫主鍵索引、一級索引)的(de)葉子(zǐ)節點上(shàng)。
在(zài)輔助索引(包括唯一索引和(hé / huò)非唯一索引)的(de)的(de)葉子(zǐ)節點上(shàng)存儲着構成索引的(de)字段和(hé / huò)主鍵。
如果查詢的(de)字段不(bù)是(shì)索引的(de)組成部分,就(jiù)需要(yào / yāo)拿着從輔助索引中查到(dào)的(de)主鍵值去聚簇索引中查詢數據,這(zhè)個(gè)過程也(yě)叫做回表。
所以(yǐ),如果一個(gè)表比較小,那麽顯然直接遍曆表比走索引要(yào / yāo)快(因爲(wéi / wèi)需要(yào / yāo)回表)。
?「注:首先,要(yào / yāo)注意這(zhè)個(gè)答案隐含的(de)條件是(shì)查詢的(de)數據不(bù)是(shì)索引的(de)構成部分,否也(yě)不(bù)需要(yào / yāo)回表操作。其次,查詢條件也(yě)不(bù)是(shì)主鍵,否則可以(yǐ)直接從聚簇索引中拿到(dào)數據。」
?
這(zhè)裏有一個(gè)概念這(zhè)裏簡單總結一下:
「B+Tree 索引」
是(shì)大(dà)多數 MySQL 存儲引擎的(de)默認索引類型。
因爲(wéi / wèi)不(bù)再需要(yào / yāo)進行全表掃描,隻需要(yào / yāo)對樹進行搜索即可,所以(yǐ)查找速度快很多。
因爲(wéi / wèi) B+ Tree 的(de)有序性,所以(yǐ)除了(le/liǎo)用于(yú)查找,還可以(yǐ)用于(yú)排序和(hé / huò)分組。
可以(yǐ)指定多個(gè)列作爲(wéi / wèi)索引列,多個(gè)索引列共同組成鍵。
适用于(yú)全鍵值、鍵值範圍和(hé / huò)鍵前綴查找,其中鍵前綴查找隻适用于(yú)最左前綴查找。如果不(bù)是(shì)按照索引列的(de)順序進行查找,則無法使用索引。
InnoDB 的(de) B+Tree 索引分爲(wéi / wèi)主索引和(hé / huò)輔助索引。主索引的(de)葉子(zǐ)節點 data 域記錄着完整的(de)數據記錄,這(zhè)種索引方式被稱爲(wéi / wèi)聚簇索引。因爲(wéi / wèi)無法把數據行存放在(zài)兩個(gè)不(bù)同的(de)地(dì / de)方,所以(yǐ)一個(gè)表隻能有一個(gè)聚簇索引。
輔助索引的(de)葉子(zǐ)節點的(de) data 域記錄着主鍵的(de)值,因此在(zài)使用輔助索引進行查找時(shí),需要(yào / yāo)先查找到(dào)主鍵值,然後再到(dào)主索引中進行查找。

「覆蓋索引」
索引包含所有需要(yào / yāo)查詢的(de)字段的(de)值。
具有以(yǐ)下優點:
索引通常遠小于(yú)數據行的(de)大(dà)小,隻讀取索引能大(dà)大(dà)減少數據訪問量。 一些存儲引擎(例如 MyISAM)在(zài)内存中隻緩存索引,而(ér)數據依賴于(yú)操作系統來(lái)緩存。因此,隻訪問索引可以(yǐ)不(bù)使用系統調用(通常比較費時(shí))。 對于(yú) InnoDB 引擎,若輔助索引能夠覆蓋查詢,則無需訪問主索引(無需回表)。
「索引的(de)使用條件」
對于(yú)非常小的(de)表、大(dà)部分情況下簡單的(de)全表掃描比建立索引更高效;
對于(yú)中到(dào)大(dà)型的(de)表,索引就(jiù)非常有效;
但是(shì)對于(yú)特大(dà)型的(de)表,建立和(hé / huò)維護索引的(de)代價将會随之(zhī)增長。這(zhè)種情況下,需要(yào / yāo)用到(dào)一種技術可以(yǐ)直接區分出(chū)需要(yào / yāo)查詢的(de)一組數據,而(ér)不(bù)是(shì)一條記錄一條記錄地(dì / de)匹配,例如可以(yǐ)使用分區技術。
作者:haxianhe
來(lái)源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出(chū)處。