搜尋
首頁資料庫mysql教程MySQL索引及優化的知識點有哪些

索引是什麼?

  • 索引是幫助MySQL進行高效率查詢的一種資料結構。好比一本書的目錄,能加快查詢的速度

#索引的結構?

索引可以有B-Tree索引,Hash索引。索引是在儲存引擎中實現的

InnoDB / MyISAM 僅支援B-Tree索引

Memory/Heap 支援B-Tree索引和Hash索引

  • #B-Tree

    B-Tree是一種非常適合用於磁碟操作的資料結構。它是一棵多路平衡查找樹。其高度一般在2-4,其非葉子節點,葉子節點,都會儲存資料。其所有的葉子節點,都在同一層。下圖是一顆B-Tree

MySQL索引及優化的知識點有哪些

  • # B Tree:B 樹是在B-Tree基礎上的一種最佳化.它和B樹的主要區別在於:B 樹的資料全部儲存在葉子節點中,且葉子節點被一個鍊錶串了起來。下圖是一顆B 樹

MySQL索引及優化的知識點有哪些

InnoDB中一個頁的大小為16KB(一個頁即B 樹上的節點),若表的主鍵為INT,大小為4位元組,那一個節點也能夠儲存4K個鍵值,假設指標和鍵值都佔相同大小,那麼高度為3的B 樹,第二層有2048個節點,第三層的葉子節點數為2048*2048 = 4194304,一個節點為16KB,則總共可容納67108864KB,即65536MB,即64G的資料。

由於葉子節點是被一個鍊錶串起來的,所以若order by 索引列,則預設已經是排好序的,所以效率會很高。

  • MyISAM索引
    MyISAM的索引和資料是分開存放的。在MyISAM的主鍵索引中,B 樹葉子節點裡,存的是記錄的位址,故MyISAM透過索引查詢,需要經過2次IO

MySQL索引及優化的知識點有哪些



MySQL索引及優化的知識點有哪些

MySQL索引及優化的知識點有哪些


##MyISAM的輔助索引和主鍵索引一樣,唯一的區別是,輔助索引中的key可以重複,而主鍵索引的key不能重複

InnoDB索引
    InnoDB的資料和索引是存放在一起的,又稱為聚集索引。資料透過主鍵索引,存放在主鍵索引B 樹的葉子節點上。
  • InnoDB主鍵索引,資料已經包含在了葉子節點中,即索引和資料存放在一起,是為聚集索引。


  •  InnoDB的輔助索引,葉子節點中存的是主鍵值,而不是位址。走輔助索引,需要檢索2次。


    InnoDB和MyISAM索引的區別:
  • InnoDB使用聚集索引,其主鍵索引葉子節點中直接儲存了數據,而其輔助索引中葉子節點存的是主鍵的值

MyISAM使用非聚集索引,資料和索引不在同一個檔案中,其主鍵索引中葉子節點上存的是該行記錄所在的位址,其輔助索引中葉子節點上存的也是記錄所在的位址,只是輔助索引的key可以重複,而主鍵索引的key不能重複

 

  • 問題

  • InnoDB為什麼不使用過長的欄位做主鍵

    過長的主鍵,會使得輔助索引所佔空間變得很大
    • #為什麼推薦InnoDB使用自增主鍵
    • 若使用自增主鍵,則每次插入新的記錄,就會順序的將新記錄添加到當前索引節點的後續位置,一頁寫滿了,才會進行開闢新的一頁,這樣使得索引結構很緊湊,且每次插入時不需要移動已有數據,非常有效率。而如果不使用自增主鍵,則每次插入新記錄時,都要選擇一個插入位置,並且可能需要移動數據,使得效率不高,且索引結構不緊湊

  • 為什麼要用B 樹,不用B樹

    #########存在哪一個存在哪? ############索引本身也比較大,通常會儲存在磁碟中,索引和資料可能是分開存放的(MyISAM的非聚集索引),也可能是一起存放的(InnoDB的聚集索引)############索引的優缺點?###########################降低IO成本,提高資料查詢效率############降低排序成本(被索引的列會自動排序,使用order by 效率會提高很多)############ ###缺點###
    • 索引會額外佔據儲存空間

    • #索引會降低更新表資料的效率。進行增刪改操作時,不僅要保存數據,還要更新對應的索引

#索引的分類

  • ##單列索引

    • 主鍵索引

    • 唯一索引

    • 普通索引

  • #組合索引

 索引使用

  • 建立索引

  •  CREATE INDEX index_name ON table_name(col_name);
    -- 或者
    ALTER TABLE table_name ADD INDEX index_name(col_name)
  • 刪除索引

  • DROP INDEX index_name ON table_name;
  • 需要建立索引的場景

    • 頻繁作為查詢條件的列,需建索引

    • 多表關聯中,關聯字段需建置索引

    • ##查詢中排序的字段,需建立索引
    不適用索引的場景
    • #寫入多讀少的表,不適合用於建立索引
    • 頻繁更新的字段,不適合用於建索引
    #explain執行計劃

現有一張user表,其索引如下所示

MySQL索引及優化的知識點有哪些其中name,age,address 三個欄位作為一個組合索引

可以使用explain對某個SQL語句進行效能分析

explain select * from user where name = 'am';

MySQL索引及優化的知識點有哪些

possible_keys

#可能用到的索引
key
實際用到的索引
key_len
用於查詢的索引的長度
ref
#如果是等值查詢,這裡會是const
rows
預計需要掃描的行數(不是精確值)
extra
#額外信息,如

    using where
  • 表示儲存引擎傳回的結果,還需要在SQL Layer層過濾


  • using index
  • 表示不需要回表查詢,一般在使用了覆蓋索引時會是這個值。覆蓋索引指的是,select中的列,全是索引列。不需要回表查詢指的是,直接走輔助索引,就能拿到索引列的值,不需要再去主鍵索引上取記錄了


  • using index condition
  • MySQL 5.6.x之後支援ICP特性(Index Condition Pushdown),可以把檢查條件下推到儲存引擎層,不符合條件的記錄,直接不讀取,而不是像原來一樣,先讀取出來,再在SQL Layer層過濾,這樣減少了儲存引擎層掃描的行數


MySQL索引及優化的知識點有哪些

    #using filesort
  • 排序時無法用到索引


type

    : 表中只有1行數據,或空表
  • const : 使用唯一索引或主鍵索引,且用where等值查詢,傳回記錄是1行,又叫唯一索引掃描

MySQL索引及優化的知識點有哪些

    ref : 針對非唯一索引,使用等值where條件,或最左前綴規則的查詢。
  • 以下是滿足了最左前綴規則,也就是對idx_name_age_add來說,滿足了最左前綴,第一個索引為name

MySQL索引及優化的知識點有哪些

    range:索引範圍掃描,常見於>,

MySQL索引及優化的知識點有哪些

MySQL索引及優化的知識點有哪些注意like時,通配符%不能放在開頭,否則會導致全表掃描

MySQL索引及優化的知識點有哪些

##index : 沒有完全符合上索引,但不用回表查詢的

MySQL索引及優化的知識點有哪些

MySQL索引及優化的知識點有哪些

all : 全表掃描,然後在SQL Layer層過濾符合要求的記錄

    索引使用规范(索引失效分析)

    1. 全值匹配
      在索引列上使用等值查询

    explain select * from user where name = 'y' and age = 15;

    MySQL索引及優化的知識點有哪些

    2. 最左前缀

    组合索引中,查询条件要从组合索引的最左列开始,如上述example中组合索引idx_name_age_add,是建立在三个列name,age,address的,若跳过name,直接用age查询,则会变为全表扫描

    explain select * from user where age = 15;

    MySQL索引及優化的知識點有哪些

    3. 不要在索引列上做计算

    4. 范围条件右侧的索引列会失效

    MySQL索引及優化的知識點有哪些

    看到第一个SQL语句,没有用上addresss索引

    5. 尽量使用覆盖索引

    explain select name,age from user where name = 'y' and age = 1;

    可以避免回表查询

    6. 索引字段不要使用不等(!= 或 ),不要判断null(is null/ is not null)
    会导致索引失效,转为全表扫描

    MySQL索引及優化的知識點有哪些

    MySQL索引及優化的知識點有哪些

    7. 索引字段上使用like时,不要以%开头

    MySQL索引及優化的知識點有哪些

    8. 索引字段如果是字符串,记得加单引号

    MySQL索引及優化的知識點有哪些

    9. 索引字段不要用or

    MySQL索引及優化的知識點有哪些

    例子总结:

    MySQL索引及優化的知識點有哪些

    以上是MySQL索引及優化的知識點有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    在MySQL中使用視圖的局限性是什麼?在MySQL中使用視圖的局限性是什麼?May 14, 2025 am 12:10 AM

    mysqlviewshavelimitations:1)他們不使用Supportallsqloperations,限制DatamanipulationThroughViewSwithJoinsOrsubqueries.2)他們canimpactperformance,尤其是withcomplexcomplexclexeriesorlargedatasets.3)

    確保您的MySQL數據庫:添加用戶並授予特權確保您的MySQL數據庫:添加用戶並授予特權May 14, 2025 am 12:09 AM

    porthusermanagementinmysqliscialforenhancingsEcurityAndsingsmenting效率databaseoperation.1)usecReateusertoAddusers,指定connectionsourcewith@'localhost'or@'%'。

    哪些因素會影響我可以在MySQL中使用的觸發器數量?哪些因素會影響我可以在MySQL中使用的觸發器數量?May 14, 2025 am 12:08 AM

    mysqldoes notimposeahardlimitontriggers,butacticalfactorsdeterminetheireffactective:1)serverConfiguration impactactStriggerGermanagement; 2)複雜的TriggerSincreaseSySystemsystem load; 3)largertablesslowtriggerperfermance; 4)highConconcConcrencerCancancancancanceTigrignecentign; 5); 5)

    mysql:存儲斑點安全嗎?mysql:存儲斑點安全嗎?May 14, 2025 am 12:07 AM

    Yes,it'ssafetostoreBLOBdatainMySQL,butconsiderthesefactors:1)StorageSpace:BLOBscanconsumesignificantspace,potentiallyincreasingcostsandslowingperformance.2)Performance:LargerrowsizesduetoBLOBsmayslowdownqueries.3)BackupandRecovery:Theseprocessescanbe

    mySQL:通過PHP Web界面添加用戶mySQL:通過PHP Web界面添加用戶May 14, 2025 am 12:04 AM

    通過PHP網頁界面添加MySQL用戶可以使用MySQLi擴展。步驟如下:1.連接MySQL數據庫,使用MySQLi擴展。 2.創建用戶,使用CREATEUSER語句,並使用PASSWORD()函數加密密碼。 3.防止SQL注入,使用mysqli_real_escape_string()函數處理用戶輸入。 4.為新用戶分配權限,使用GRANT語句。

    mysql:blob和其他無-SQL存儲,有什麼區別?mysql:blob和其他無-SQL存儲,有什麼區別?May 13, 2025 am 12:14 AM

    mysql'sblobissuitableForStoringBinaryDataWithInareLationalDatabase,而ilenosqloptionslikemongodb,redis和calablesolutionsolutionsolutionsoluntionsoluntionsolundortionsolunsonstructureddata.blobobobissimplobisslowdeperformberbutslowderformandperformancewithlararengedata;

    mySQL添加用戶:語法,選項和安全性最佳實踐mySQL添加用戶:語法,選項和安全性最佳實踐May 13, 2025 am 12:12 AM

    toaddauserinmysql,使用:createUser'username'@'host'Indessify'password'; there'showtodoitsecurely:1)choosethehostcarecarefullytocon trolaccess.2)setResourcelimitswithoptionslikemax_queries_per_hour.3)usestrong,iniquepasswords.4)Enforcessl/tlsconnectionswith

    MySQL:如何避免字符串數據類型常見錯誤?MySQL:如何避免字符串數據類型常見錯誤?May 13, 2025 am 12:09 AM

    toAvoidCommonMistakeswithStringDatatatPesInMysQl,CloseStringTypenuances,chosethirtightType,andManageEngencodingAndCollat​​ionsEttingSefectery.1)usecharforfixed lengengtrings,varchar forvariable-varchar forbariaible length,andtext/blobforlargerdataa.2 seterters seterters seterters

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱門文章

    熱工具

    SublimeText3 Linux新版

    SublimeText3 Linux新版

    SublimeText3 Linux最新版

    MantisBT

    MantisBT

    Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    SAP NetWeaver Server Adapter for Eclipse

    SAP NetWeaver Server Adapter for Eclipse

    將Eclipse與SAP NetWeaver應用伺服器整合。

    VSCode Windows 64位元 下載

    VSCode Windows 64位元 下載

    微軟推出的免費、功能強大的一款IDE編輯器