「MySQL高級篇」MySQL索引原理,設計原則( 五 )


何時建立索引

  1. where中的查詢字段
  2. 查詢中與其他表關聯的字段,比如外鍵
  3. 排序的字段
  4. 統計或分組的字段
何時達咩索引
  1. 表中數據量很少
  2. 經常改動的表
  3. 頻繁更新的字段
  4. 數據重復且分布均勻的表字段(比如包含了很多重復數據,那此時多叉樹的二分查找,其實用處不大,可以理解為O(logn)退化了)
索引相關語法創建索引
默認會為主鍵創建索引--primary
CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEX index_name[USINGindex_type]ON tbl_name(index_col_name,...)index_col_name : column_name[(length)][ASC | DESC]查找索引
結尾加上\G , 可以變成豎屏顯示
select index from tbl_name\G;刪除索引drop INDEX index_name on tbl_name ;變更索引1). altertabletb_nameaddprimarykey(column_list); 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL 2). altertabletb_nameaddunique index_name(column_list); 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)3). altertabletb_nameaddindex index_name(column_list); 添加普通索引,索引值可以出現多次 。4). altertabletb_nameaddfulltextindex_name(column_list); 該語句指定了索引為FULLTEXT, 用于全文索引查看索引使用情況show status like 'Handler_read%';-- 查看當前會話索引使用情況show global status like 'Handler_read%'; -- 查看全局索引使用情況Handler_read_first:索引中第一條被讀的次數 。如果較高,表示服務器正執行大量全索引掃描(這個值越低越好) 。?
Handler_read_key:如果索引正在工作,這個值代表一個行被索引值讀的次數,如果值越低,表示索引得到的性能改善不高,因為索引不經常使用(這個值越高越好) 。?
Handler_read_next :按照鍵順序讀下一行的請求數 。如果你用范圍約束或如果執行索引掃描來查詢索引列 , 該值增加 。?
Handler_read_prev:按照鍵順序讀前一行的請求數 。該讀方法主要用于優化ORDER BY ... DESC 。?
Handler_read_rnd :根據固定位置讀一行的請求數 。如果你正執行大量查詢并需要對結果進行排序該值較高 。你可能使用了大量需要MySQL掃描整個表的查詢或你的連接沒有正確使用鍵 。這個值較高,意味著運行效率低,應該建立索引來補救 。?
Handler_read_rnd_next:在數據文件中讀下一行的請求數 。如果你正進行大量的表掃描,該值較高 。通常說明你的表索引不正確或寫入的查詢沒有利用索引 。
總結
  1. 索引簡單來說就是一個排好序的數據結構 , 可以方便我們檢索數據,而不需要盲目的進行全表掃描 。
    • 索引底層有很多種實現結構,這篇主要只是講解了BTREE索引,如果對樹這一數據結構還不太熟悉的小伙伴 , 可以關注我后續數據結構專欄 , 會整理關于普通樹,二叉樹,二叉排序樹的文章 。
  2. 索引分類:
    1. 主鍵索引
    2. 輔助索引
這里我們還擴展了索引下推,是一個十分重要的知識點,需要仔細回味 。
  1. 索引的相關設計原則 , 索引雖好 , 但也不可貪杯,不能為了用索引而建索引 。
  2. 索引的相關語法,很容易上手的 。
  3. 查看索引的使用情況 。
下篇預告這篇我們主要講的都是索引的理論知識,還簡單介紹了索引的語法,可以看得出索引用起來其實是不難的,關鍵在于如何設計和優化 。
因為在很多情況下,索引其實很容易失效,我們要如何避免,以及如何正確使用索引來進行SQL優化,敬請期待下篇 。
參考文獻
  • 掘金:https://juejin.cn/post/6844903967365791752
  • 思否:https://segmentfault.com/a/1190000020416577
  • MySQL45講
  • 黑馬MySQL高級篇

「MySQL高級篇」MySQL索引原理,設計原則

文章插圖
收藏=白嫖 , 點贊+關注才是真愛?。?!本篇螑缆壤i脅歡災?nbsp;, 還請在評論區指出,歡迎添加我的微信一起交流:Melo__Jun
友鏈
  • 我的一年后臺練習生涯
  • 聊聊Java
  • 分布式開發實戰
  • Redis入門與實戰
  • 數據結構與算法
【「MySQL高級篇」MySQL索引原理,設計原則】

推薦閱讀