limit的奇怪現象

一、環境準備

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;
在這裏插入圖片描述

三、分析

  1. 只有在索引上使用order by,才能減少limit掃描的行數。如,1.2、2.2、2.3。
  2. 只有限制了一個區間範圍,才能減少limit掃描的行數。如,1.7。
  3. 不使用where條件,limit掃描的行數反而更多。如,1.1、2.1。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章