1. 程式人生 > >高效能Mysql---------------高效能索引

高效能Mysql---------------高效能索引

索引優化是對效能優化最有效的手段。索引能輕易將查詢效能提高几個數量級。

mysql中儲存引擎先在索引中找到對應值,然後根據匹配的索引記錄找到對應的資料行。
例如:
select name from user where id = 5;
id上有索引,Mysql使用索引找到id為5的行,然後返回資料。
索引對多個值進行排序的依據是create table 語句中定義索引時列的順序。

最常見的B-Tree索引,按照順序儲存資料。索引有以下三個優點:
1)索引大大減少了伺服器需要掃描的資料量;
2)索引幫助伺服器避免排序和臨時表;
3)索引可以將隨機I/O變成順序I/O

高效能索引策略:

1)獨立的列:索引列不能是表示式的一部分,也不能是函式的引數;
2)字首索引:一個列, 字元很長,又必須加索引,需要選擇足夠長的字首保證較高的選擇性,同時又不能太長;
建立字首索引: alter table user add key(name(7));
無法用字首索引做order by和 group by,也無法用字首索引做覆蓋掃描
3)多列索引
子句中的排序、分組和範圍條件等其他因素,可能對查詢的效能造成非常大的影響。
4)覆蓋索引
一個索引包含了所有需要查詢的欄位的值,我們就稱之為覆蓋索引
發起一個被索引覆蓋的查詢時,在explain的extra的列可以看到"using index"的資訊。
多列索引(name, age),如果只訪問這兩列,就可以用這個索引做覆蓋索引
select name, age from user

如果索引不能覆蓋查詢所有的列,就得每掃描一條索引記錄就回表查詢一次對應的行。

選擇索引和使用索引時,有如下三個原則需要記住:
1.單行訪問是很慢的;
2.按順序訪問範圍資料是很快的;
3.索引覆蓋查詢時很快的

遇到order by排序,而查詢資料並不是有序的,可以進行如下優化:
1)修改邏輯,不在mysql中使用order by而是在應用中自己進行排序
2)使用mysql索引,將待排序的內容放到索引中,直接利用索引的排序

mysql多表關聯left join其他表的時候,如果以其他表的欄位作為查詢條件都會產生臨時表,解決思路:將非直接關聯轉成直接關聯