MySQL数据库ORDER BY优化总结(为排序使用索引)
副问题[/!--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'); 2. 建设btree索引 create index idx_c1234 on test(c1,c2,c3,c4); show index from test; 3. 范畴扫导致全表扫描 explain select * from test where c1>'a1' order by c1; 说明: 在c1,c2,c3,c4上建设了索引,直接在c1上行使范畴,导致了索引失效,全表扫描:type=ALL,ref=Null。由于此时c1首要用于排序,并不是查询。 行使c1举办排序,呈现了Using filesort。 办理要领:行使包围索引。 4、包围索引--》优化 explain select c1 from testwhere c1>'a1' order by c1; 说明: 行使了包围索引,不走全扫,走索引范畴扫描 排序时凭证索引的次序,以是不会呈现Using filesort。 这里不懂不要紧,后头我会分享索引的八大法例,担保看得懂... 5. 没有按最左列索引排序 explain select c1 from testwhere c1>'a1' order by c2; 说明: 这里呈现了Using filesort,是由于排序用的c2,与索引的建设次序(c1,c2,c3,c4)纷歧致。 6. 排序索引列与索引建设的次序相反 explain select c1 from testwhere c1>'a1' order by c2,c1; 说明: 这里呈现了Using filesort。由于排序索引列(c2,c1)与索引建设的次序(c1,c2)相反,从而发生了重排,也就呈现了Using filesort。 7. order by索引列排序纷歧致 explain select c1 from testwhere c1>'a1' order by c1 asc,c2 desc; 说明: 固然排序的字段列与索引次序一样,且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 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |