單表優化
本篇主要講解Mysql索引的單表優化實戰
建立表student
例子:查詢年齡大於18的大學生並將結果按照id排序
- 1,查詢SQL
select * from students where age>18 and type=‘大學生’ order by id
-
2,分析這條SQL
Explain
select * from students where age>18 and type=‘大學生’ order by id
索引類型爲all,屬於最不理想的結果(system>const>eq_ref>ref>range>index>all索引類型性能由高到低的排序)
key:因爲我們還沒有建立索引,所以這裏沒有使用到索引
rows:執行該sql預計會查詢7行
Extra:using filesort 使用了文件排序 ,同樣很不理想 -
3,給這幾個字段加上索引
3.1 給這三個字段加上索引
create index ind1_age_type_id on students(age,type,id);
3.2再次分析這條sql
Explain
select * from students where age>18 and type=‘大學生’ order by id
對比未建立索引的優缺點:
優點:type由之前的all變爲了range,rows由之前的7行變成了現在的4行
不足:extra中仍然存在using filesort這個文件排序
原因:這是因爲當索引類型爲range範圍索引時,其右邊的索引會失效,所以剛纔的sql其實只有age這個索引成功了,type和id索引失效了。
3.3 重新考慮建立索引
刪除之前的索引:
drop index ind1_age_type_id on students
結合上面範圍索引的原則,我們重新建立索引
alter table students add index ind_type_id_age(type,id,age)
3.4重新分析這條sql
Explain
select * from students where age>18 and type=‘大學生’ order by id
可以看到相比上個索引優缺點:
優點:type由range變成了ref,extra中文件排序消失了
缺點:索引的長度增加了,這也是因爲使用了三個索引值,才導致索引鍵長度增加了