某张表有一个主键 id ,一个 item_id 字段,我对 item_id 字段加了索引,但是当我使用 select * from table_name limit 10000,20 查询时,发现 Rows_examined 为 10 万,大约等于全表大小。这是什么原因呢?
1
wesley Apr 6, 2016
需要加上 order by item_id
|
2
dongyado Apr 6, 2016
你的查询语句都没用 id,item_id 肯定会全表扫描的啊。。。
|
3
keakon Apr 6, 2016
没有 where 条件
|
4
sghcel Apr 6, 2016 select item_id from table_name limit 10000,20 这样就不会全表扫描
具体原因看我的 blog: http://dorid.me/2016/02/03/mysql-limit-performance-optimize/ |
5
vincenttone Apr 6, 2016
explain select * from table_name limit 10000,20;
explain select * from table_name limit 10000,20 order by id desc; explain select * from table_name where item_id = 1 limit 10000,20; 挨个执行看看,你还需要花 20 分钟研究一下索引到底是什么 |
6
rqrq Apr 6, 2016
先加上 order by id desc 试试,还是不行试试:
select * from table_name where id < (select min(id) from (select id from table_name order by id desc limit 10000) as tmp) limit 20 |
7
msg7086 Apr 6, 2016 MySQL 的分页是先读再丢,所以应该要读了扔了 10 万条记录以后再返回。
我自己是先读 ID 然后再用 ID IN () 去查表返回的。 |
8
davidzhang Apr 6, 2016
因为你没有用到索引啊
|
9
stabc Apr 6, 2016
|
10
treycheng Apr 6, 2016
这个 limit 10000,20 做分页查询 首先会查处前面 10000 行的所有 select 的内容, 然后丢弃掉
分页查询 一般先查询你目标内容的主键 再通过主键查询目标行 |
14
jiehuangwei Apr 6, 2016
看到这种SQL,就有想往死里打的冲动。。。。
|
15
wikimore Apr 6, 2016
你这个 SQL 就是不全表扫 也不会太快 LIMIT 10000,20
|
16
wwek Apr 6, 2016
大翻页问题
翻页从产品角度优化. 只给下一页 ,获取更多什么的 |
22
elgoog1970 Apr 7, 2016
|