一、環境準備
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。