水下功夫做透,水上才能顺风顺水。

Mysql的order by 执行原理

说明:

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);

 

 

当然,覆盖索引能够提升效率,但是维护索引也是需要代价的,因此还需要权衡使用。

 

 

posted @ 2020-05-23 22:28  北方寒士  阅读(777)  评论(0编辑  收藏  举报