说明:
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);
当然,覆盖索引能够提升效率,但是维护索引也是需要代价的,因此还需要权衡使用。