select * from orders_history where type=8 limit 1000,10;
該條語句將會從表 orders_history 中查詢offset: 1000開始之後的10條資料,也就是第1001條到第1010條資料(1001 <= id <= 1010)。
資料表中的記錄預設使用主鍵(一般為id)排序,上面的結果相當於:
select * from orders_history where type=8 order by id limit 10000,10;
使用子查詢優化
這種方式先定位偏移位置的 id,然後往後查詢,這種方式適用於 id 遞增的情況。
select * from orders_history where type=8 limit 100000,1;
select id from orders_history where type=8 limit 100000,1;
select * from orders_history where type=8 and
id>=(select id from orders_history where type=8 limit 100000,1)
limit 100;
select * from orders_history where type=8 limit 100000,100;
4條語句的查詢時間如下:
第1條語句:3674ms
第2條語句:1315ms
第3條語句:1327ms
第4條語句:3710ms
針對上面的查詢需要注意:
比較第1條語句和第2條語句:使用 select id 代替 select * 速度增加了3倍
比較第2條語句和第3條語句:速度相差幾十毫秒
比較第3條語句和第4條語句:得益於 select id 速度增加,第3條語句查詢速度增加了3倍
這種方式相較於原始一般的查詢方法,將會增快數倍。
使用 id 限定優化
這種方式假設資料表的id是連續遞增的,則我們根據查詢的頁數和查詢的記錄數可以算出查詢的id的範圍,可以使用 id between and 來查詢:
select * from orders_history where type=2 and id between 1000000 and 1000100 limit 100;
這種查詢方式能夠極大地優化查詢速度,基本能夠在幾十毫秒之內完成。限制是只能使用於明確知道id的情況,不過一般建立表的時候,都會新增基本的id欄位,這為分頁查詢帶來很多便利。
還可以有另外一種寫法:
select * from orders_history where id >= 1000001 limit 100;
當然還可以使用 in 的方式來進行查詢,這種方式經常用在多表關聯的時候進行查詢,使用其他表查詢的id集合,來進行查詢:
select * from orders_history where id in
(select order_id from trade_2 where goods = 'pen')
limit 100;
關於資料表的id說明
一般情況下,在資料庫中建立表的時候,強制為每一張表新增 id 遞增字段,這樣方便查詢。
如果像是訂單庫等資料量非常龐大,一般會進行分庫分表。這個時候不建議使用資料庫的 id 作為唯一標識,而應該使用分布式的高併發唯一 id 生成器來生成,並在資料表中使用另外的字段來儲存這個唯一標識。
使用先使用範圍查詢定位 id (或者索引),然後再使用索引進行定位資料,能夠提高好幾倍查詢速度。即先 select id,然後再 select *;
mysql 分頁查詢 失效 mysql分頁查詢
比如每頁10條,分頁查詢 語法 select from table limit offset,rows offset指定要返回的第一行的偏移量,rows第二個指定返回行的最大數目。初始行的偏移量是0 不是1 select from table limit 0,10 第一頁 select from t...
MySQL分頁查詢
今天研究了一下mysql的分頁查詢,記錄並分享如下 方式1 select from table order by id limit m,n 該語句的意思為,查詢m n條記錄,去掉前m條,返回後n條記錄。無疑該查詢能夠實現分頁功能,但是如果m的值越大,查詢的效能會越低 越後面的頁數,查詢效能越低 因為...
MySQL分頁查詢
在實際運用過程中,當我們需要對mysql資料庫中查詢的語句進行分頁處理時,通常使用的是limit方法。基礎語法為 select from table name limit page 1 num,num 分頁查詢table name表,page為頁數,num為每頁顯示的資料條數這個語句是最簡單的分頁查...