以下2个sql语句,执行时间同样。 由于查询字段id被索引覆盖。mysql
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条,几乎无开销。可是切记,这里仍然涉及了太多的影响结果集操做sql
其实也能够分红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 和 $maxlastpostpost
上翻页查询为 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是不能使用索引的。code