學習《高效能MySQL》筆記-索引篇
阿新 • • 發佈:2018-11-09
1.索引釋義:
索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。如果想按特定職員的姓來查詢他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取資訊。比如書本的目錄,那幾頁目錄就是索引內容,目錄中的維度比如“章節名稱”、“首字母”對應的就是索引的列。
2.索引優點:
2.1>索引大大減少了伺服器需要掃描的資料量
2.2>索引可以幫助伺服器避免排序和臨時表
2.3>索引可以將隨機I/O變為順序I/O
3.怎麼評判優秀索引
在《高效能MySQL》中文第三版提到了索引“三星系統”原則: 3.1>索引將相關的記錄放到一起,則獲得一星 3.2>如果索引中的資料順序和查詢中的排列順序一致則獲得二星 3.3>如果索引中的列包含了查詢中的需要的全部列則獲得三星 個人理解: 1."索引將相關的記錄放到一起",這段話真的無法理解,什麼算相關記錄?和什麼相關? 2."索引中的資料順序和查詢中的排列順序一致",根據索引篩選出的資料順序和where條件結果集順序一致?還是不懂。 3."如果索引中的列包含了查詢中的需要的全部列",這個是指“覆蓋索引”,建一個包含所有返回欄位欄位的組合索引。
4.高效能的索引策略
4.1>獨立的列 “獨立的列”是指索引不能是表示式的一部分,也不能是函式的引數 4.2>字首索引和索引選擇器 字首索引如果太長會讓索引很大且很慢,太短選擇性又會很低。多少合適呢?可以根據“索引選擇性”來判定. 索引選擇性=(根據索引篩選出的條數)/(表中總記錄),越接近1選擇性越好。例如唯一索引,選擇性為1效能最好。 判定標準:當前綴索引選擇性和和完整列的選擇性接近一致時,基本上就可以用了 建立字首索引: alter table t_user add key (phone(7)); 字首索引能使索引更小、更快,但是也有其缺點:mysql無法使用字首索引做ORDER BY和GROUP BY, 也無法使用字首索引做覆蓋掃描(什麼叫覆蓋掃描?) 4.3>多列索引 即把多個單列索引合併到一起,建立一個包含多個列的索引。其中多列索引需要注意以下幾點: 4.3.1> 4.4>選擇合適的索引列順序 對於如何決定多列索引的列順序:當不需要考慮排序和分組時,將選擇性最高的列放在索引的最前列是很好的。 因為這時候索引的作用只是用來優化where條件的查詢。當需要排序和分組時應該盡力去避免隨機I/O 4.5>聚簇索引 聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。 聚簇索引就是按照某個規則把資料儲存在一起,就像是一個圖書館,有4排書架ABCD, 每個書架有5層,每層有5個區間。當你看到A後你就知道後面是B。 一張表只能有一個聚簇索引,因為你排列也只能用一個規則,就像這個圖書館,你總不能想按ABCD又想按ACBD 4.6>覆蓋索引:如果一個索引包含(或者說覆蓋),所有需要查詢的欄位的值,我們就稱之為覆蓋索引 MyISAM引擎可能壓縮索引使之更小,所以和覆蓋索引搭配是非常合適的。 但須注意MyISAM是沒有事務的,可用於查詢多的情況MySQL只能使用B-Tree索引做覆蓋索引