limit m,n 的意义是在选查询得到的结果中跳过m条,从第m+1(包括)条开始,拿连续的n条作为结果返回。根据它的原理可以知道,select ....limit m,n时要扫描得到的数据条数是m+n条。
这就导致m特别大的时候,select执行完成会花费很多时间。但是limit大都数情况下又是必须要用的,因为limit可以让数据库只返回服务器真正需要的数据条数,减少了网络中传输的开销。
现在有表table1:
id value type
-------------------------------------
1 100 0
2 2009 1
..... ...... ....
id为递增主键,value建立了索引。这个表有几百万的数据,现在执行sql:
select * from table1 where value = 100 limit 300000,10
上述sql很简单,人肉解析: 从为value建立的索引上找到300010条value=100的记录的id,再拿这300010个id去主键索引找到对应的叶子结点,拿到每个id对应的数据返回。这种方式下,sql的执行非常耗时。
解决办法1,使用索引覆盖得到含300010条数据的子表,与原表做连接,