如果需要查询 id 不是连续的一段,最佳的方法就是先找出 id ,然后用 in 查询
SELECT * FROM table WHERE id IN(10000, 100000, 1000000...);
索引列上使用in速度是很快的
1.SELECT * FROM table ORDER BY id LIMIT 1000000, 10;
2.SELECT * FROM table WHERE id >= (SELECT id FROM table LIMIT 1000000, 1) LIMIT 10;
3.SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010;
1和2结果一样,但耗时不一样,2要远快于1。
3的速度快于2(5至10倍),但结果不一定一样,只有在table没有删除过记录时,查询的结果才一样。
一般认为索引列的离散值越接近count(*),自增ID,in性能越好。离散值低的话,有可能会进行全表扫描。
实例:
1.http://blog.csdn.net/zhang515745112/article/details/51818854
我们就如下两种解决方法:
(1)、通过判断id的范围来分页
select id,my_sn from big_data where id>5000000 limit 10;
也得到了分页的数据,但是我们发现如果id不是顺序的,也就是如果有数据删除过的话,那么这样分页数据就会不正确,这个是有缺陷的。
(2)、通过连接查询来分页
我们可以先查询500w条数据开始分页的那10个id,然后通过连接查询显示数据
mysql> select b.id,b.my_name from big_data as b inner join (select id from big_data order by id limit 4500000,10) as tmp on tmp.id=b.id;
一般认为子查询会比拆分成多个查询语句速度快,但在某些情况下拆分查询语句速度可能会更快
http://www.cnblogs.com/xh831213/archive/2012/05/09/2491272.html
desc select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839');
索引失效,原因未知。导致全表扫描。
解决方法:拆分或者改为join
修改前:select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839');
修改后:select a.* from abc_number_prop a inner join abc_number_phone b on a.number_id = b.number_id where phone = '82306839';