一、环境准备
mysql InnoDB有个表:
viewing_number(1814483行数据)
列:id、content_id、sel_count、create_time、update_time
索引: content_id
viewing_number_copy(1814483行数据)
列:id、content_id、sel_count、create_time、update_time
索引: content_id、update_time
二、观察
要取1000条数据(不限条件),怎样取可以使扫描的行数最少。
1. viewing_number
(1)explain select id from viewing_number v limit 1000;
(2)explain select id from viewing_number v order by id limit 1000;
(3)explain select id from viewing_number v where id>0 limit 1000;
(4)explain select id from viewing_number v where id>0 order by id limit 1000;
(5)explain select id,update_time from viewing_number v where id>0 limit 1000;
(6)explain select id,update_time from viewing_number v where id>0 order by id limit 1000;
(7)explain select id,update_time from viewing_number v where id>0 and id<1000 order by id limit 1000;
(8)explain select id,update_time from viewing_number v order by update_time limit 1000;
(9)explain select id,update_time from viewing_number v where id>0 order by update_time limit 1000;
2. viewing_number_copy
(1)explain select id from viewing_number_copy v limit 1000;
(2)explain select id from viewing_number_copy v order by id limit 1000;
(3)explain select id,update_time from viewing_number_copy v order by update_time limit 1000;
(4)explain select id from viewing_number_copy v where id>0 limit 1000;
(5)explain select id from viewing_number_copy v order by id limit 1000;
(6)explain select id,update_time from viewing_number_copy v where id>0 limit 1000;
(7)explain select id from viewing_number_copy v order by id limit 1000;
三、分析
- 只有在索引上使用order by,才能减少limit扫描的行数。如,1.2、2.2、2.3。
- 只有限制了一个区间范围,才能减少limit扫描的行数。如,1.7。
- 不使用where条件,limit扫描的行数反而更多。如,1.1、2.1。