高效能MySQL 第五章建立高效能的索引(2)

2022-08-05 10:48:14 字數 1193 閱讀 4839

高效能的索引策略

一、獨立的列

如果查詢中的列不是獨立的,則mysql就不會使用索引。「獨立的列」是指索引列不能是表示式的一部分,也不能是函式的函式。

二、字首索引和索引選擇性

索引部分字元會降低索引的選擇性,索引的選擇性是指,不重複的索引值(也稱為基數,cardinality)和資料表的記錄總數(#t)的比值,範圍從1/#t到1之間。索引的選擇性越高則查詢效率越高,因為選擇性高的索引可以讓mysql在查詢時過濾掉更多的行。唯一索引的選擇性是1,這是最好的索引選擇性,效能也是最好的。

一般情況下某個列字首的選擇性也是足夠高的,足以滿足查詢效能。對於blob、text或者很長的varchar型別的列,必須使用字首索引,因為mysql不允許索引這些列的完整長度。

三、多列索引

union的方式可能更好。

四、選擇合適的索引列順序

五、聚簇索引

聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。

當表有聚簇索引時,它的資料行實際上存放在索引的葉子頁(leaf page)中。術語「聚簇」表示資料行和相鄰的鍵值緊湊的儲存在一起。因為無法同時把資料行存放在兩個不同的地方,所以乙個表只能有乙個聚簇索引。

innodb和myisam的資料分布對比

在innodb表中按主鍵順序插入行

六、覆蓋索引

如果乙個索引包含(或者說覆蓋)所有需要查詢的字段的值,我們就稱之為「覆蓋索引」。

不是所有型別的索引都可以成為覆蓋索引,覆蓋索引必須要儲存索引列的值,而雜湊索引、空間索引和全文索引等都不儲存索引列的值,所以mysql只能使用b-tree索引做覆蓋索引。

七、使用索引掃瞄來做排序

mysql有兩種方式可以生成有序的結果:通過排序操作;或者按索引順序掃瞄;如果explain出來的type列的值為「index」,則說明mysql使用了索引掃瞄來做排序。

只有當索引的列順序和order by子句的順序完全一致,並且所有列的排序方向(倒序或正序)都一樣時,mysql才能夠使用索引來對結果做排序。如果查詢需要關聯多張表,則只有當order by子句引用的字段全部為第乙個表時,才能使用索引做排序。

八、壓縮(字首壓縮)索引

myisam使用字首壓縮來減少索引的大小,從而讓更多的索引可以放入記憶體中,這在某些情況下能極大的提高效能。預設只壓縮字串,但通過引數設定也可以對整數做壓縮。

九、冗餘和重複索引

十、未使用的索引

十一、索引和鎖

高效能MySQL 第五章建立高效能的索引(1)

在mysql中,儲存引擎使用索引,其先在索引中找到對應值,然後根據匹配的索引記錄找到對應的資料行。索引可以包含乙個或多個列的值。一 索引的型別 在mysql中,索引是在儲存引擎層而不是伺服器層實現的。mysql支援的索引型別 b tree索引 innodb使用的是b tree。b tree通常意味著...

高效能mysql 第五章索引(3)

myisam使用字首壓縮來減少索引的大小,預設只壓縮字串,但是通過設定也可以對整數做壓縮。壓縮可以使用更少的空間,代價是某些操作可能更慢。特別是倒序的查詢,測試表明,對於cpu密集型的應用,查詢會很慢,特別是倒序。對於i o密集型應用,查詢可能會不錯。可以在create table的語句中指定pac...

索引的底層實現 高效能Mysql(第五章筆記2)

b 樹索引的使用 我們日常使用中,索引可以引用了很多列,而不是單一列的索引。1 如果不是按照索引的最左列開始查詢,則無法使用索引。2 不能跳過索引中的列,否則生效的只能是索引左側沒跳過的列。3 如果查詢中有某個列是範圍查詢,則其右邊的列都無法使用索引優化查詢。上面三條意味著,索引中列的順序,至關重要...