MySQL中,小表該不(bù)該建索引? - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

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ū)處。

相關案例查看更多