說明:
1. mysql使不使用索引與所查列無關,只與索引本身,where條件,order by 字段,group by 字段有關。
2. 索引的作用一個是查找,一個是排序。
order by語句使用索引最左前列,使用where子句與order by子句條件列組合滿足索引最左前列。
CREATE TABLE user ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, PRIMARY KEY (id), KEY city (city) ) ENGINE=InnoDB;
如果能夠保證從city這個索引上取出來的行,天然就是按照 name 遞增排序的話,是不是就可以不用再排序了呢?
因此想到了聯合索引,創建(city,name)聯合索引,sql 語句如下:
alter table user add index city_user(city, name);
select city,name,age from user where city='蘇州' order by name limit 1000;
還能不能優化呢,朋友們還記得覆蓋索引嗎?覆蓋索引的好處就是能夠避免再次回表查詢。
我們創建(city,name,age)聯合索引,這樣在執行上面的查詢語句就能使用覆蓋索引了,避免了回表查詢了,sql 語句如下:
alter table user add index city_user_age(city, name, age);
當然,覆蓋索引能夠提升效率,但是維護索引也是需要代價的,因此還需要權衡使用。