标签:
原文:mysql索引优化如下2个sql语句,执行时间一样。 因为查询字段id被索引覆盖。
select id from order_manage where create_time > '2014-01-01'
order by create_time desc limit 100000,10
select a.id from order_manage a
inner join ( select id from order_manage
where create_time > '2014-01-01'
order by create_time desc limit 1000,10) b on a.id = b.id
如下2条sql,使用inner join要快一个数量级。 inner join影响结果集仍然是$start +30,但是数据获取的过程(Sending data状态)发生在索引文件中,而不是数据表文件,这样所需要的系统开销就比前一种普通的查询低一个数量级,而主查询的影响结果集只有30条,几乎无开销。但是切记,这里仍然涉及了太多的影响结果集操作
其实也可以分成2条sql语句来做,第一条使用覆盖索引查询出id,在使用in查询出需要的字段数据。
select * from order_manage where create_time > '2014-01-01'
order by create_time desc limit 100000,10
select * from order_manage a
inner join ( select id from order_manage
where create_time > '2014-01-01'
order by create_time desc limit 1000,10) b on a.id = b.id
每次查询的时候将该页查询结果中最大的 $lastpost和最小的分别记录为 $minlastpost 和 $maxlastpost
上翻页查询为
select * from post where tagid=$tagid and lastpost<$minlastpost order by lastpost desc limit 30;
下翻页为
select * from post where tagid=$tagid and lastpost>$maxlastpost order by lastpost limit 30;
使用这种方式,影响结果集只有30条,效率极大提升。
如下sql :
select * from user where area=’$area’ and sex=’$sex’ order by lastlogin desc limit 0,30;
建立复合索引并, area+sex+lastlogin 三个字段的复合索引(注意顺序),order by的字段要在最后。where条件字段,唯一性最好的要在最前。
Area+sex+lastlogin复合索引时(切记lastlogin在最后),该索引基于area+sex+lastlogin 三个字段合并的结果排序。复合索引的使用是符合左边原则。a,b,c的复合索引
abc,ab,a,可以使用索引,其他情况都不能使用索引。
复合索引的使用原则是第一个条件应该是复合索引的第一列必须使用,并且不能夸列。ac是不能使用索引的。
查询条件与索引的关系决定影响结果集
外键和join尽量不用
标签:
原文地址:http://www.cnblogs.com/lonelyxmas/p/4193505.html