1. 程式人生 > >學習《高效能MySQL》筆記-索引篇

學習《高效能MySQL》筆記-索引篇

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索引做覆蓋索引