加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL数据库ORDER BY优化总结(为排序使用索引)

发布时间:2019-12-26 00:14:51 所属栏目:编程 来源:站长网
导读:副问题#e# 在行使order by时,常常呈现Using filesort,以是对付此类sql语句我们必要去极力优化,使其只管行使Using index。 那么,我们对付这范例的语句我们怎么去做优化呢?由于这一块照旧较量轻易夹杂的,以是我弄了个尝试,信托各人跟我一路做下尝试就都
副问题[/!--empirenews.page--]

在行使order by时,常常呈现Using filesort,以是对付此类sql语句我们必要去极力优化,使其只管行使Using index。

那么,我们对付这范例的语句我们怎么去做优化呢?由于这一块照旧较量轻易夹杂的,以是我弄了个尝试,信托各人跟我一路做下尝试就都能领略了~

数据库

1. 情形筹备

drop table if exists test; 

create table test( 

id int primary key auto_increment, 

c1 varchar(10), 

c2 varchar(10), 

c3 varchar(10), 

c4 varchar(10), 

c5 varchar(10) 

) ENGINE=INNODB default CHARSET=utf8; 

 

insert into test(c1,c2,c3,c4,c5) values('a1','a2','a3','a4','a5'); 

insert into test(c1,c2,c3,c4,c5) values('b1','b2','b3','b4','b5'); 

insert into test(c1,c2,c3,c4,c5) values('c1','c2','c3','c4','c5'); 

insert into test(c1,c2,c3,c4,c5) values('d1','d2','d3','d4','d5'); 

insert into test(c1,c2,c3,c4,c5) values('e1','e2','e3','e4','e5'); 

mysql数据库ORDER BY优化总结(为排序行使索引)

2. 建设btree索引

create index idx_c1234 on test(c1,c2,c3,c4); 

show index from test; 

mysql数据库ORDER BY优化总结(为排序行使索引)

3. 范畴扫导致全表扫描

explain select * from test where c1>'a1' order by c1; 

mysql数据库ORDER BY优化总结(为排序行使索引)

说明:

在c1,c2,c3,c4上建设了索引,直接在c1上行使范畴,导致了索引失效,全表扫描:type=ALL,ref=Null。由于此时c1首要用于排序,并不是查询。

行使c1举办排序,呈现了Using filesort。

办理要领:行使包围索引。

4、包围索引--》优化

explain select c1 from testwhere c1>'a1' order by c1; 

mysql数据库ORDER BY优化总结(为排序行使索引)

说明:

行使了包围索引,不走全扫,走索引范畴扫描

排序时凭证索引的次序,以是不会呈现Using filesort。

这里不懂不要紧,后头我会分享索引的八大法例,担保看得懂...

5. 没有按最左列索引排序

explain select c1 from testwhere c1>'a1' order by c2; 

mysql数据库ORDER BY优化总结(为排序行使索引)

说明:

这里呈现了Using filesort,是由于排序用的c2,与索引的建设次序(c1,c2,c3,c4)纷歧致。

6. 排序索引列与索引建设的次序相反

explain select c1 from testwhere c1>'a1' order by c2,c1; 

mysql数据库ORDER BY优化总结(为排序行使索引)

说明:

这里呈现了Using filesort。由于排序索引列(c2,c1)与索引建设的次序(c1,c2)相反,从而发生了重排,也就呈现了Using filesort。

7. order by索引列排序纷歧致

explain select c1 from testwhere c1>'a1' order by c1 asc,c2 desc; 

mysql数据库ORDER BY优化总结(为排序行使索引)

说明:

固然排序的字段列与索引次序一样,且order by默认升序,这里c2 desc酿成了降序,导致与索引的排序方法差异,从而发生Using filesort。假如是order by c1 asc,c2 asc可能order by c1 desc,c2 desc就会是using index了。

尝试总结

1. MySQL支持两种方法的排序filesort和index

Using index是指MySQL扫描索引自己完成排序。index服从高,filesort服从低。

2. 为排序行使索引

假设KEY test(a,b,c)

(1) order by 能行使索引最左前缀

-order by a 

-order by a,b 

-order by a,b,c 

-order by a asc,b asc,c asc 

-order by a desc,b desc,c desc 

(2) 假如where行使索引最左前缀定位为常量,则order by可以行使索引

-where a= const order by b,c 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读