mysql分页查询减轻压力_mysql分页查询优化
在實際的項目中,分頁查詢是在尋常不過的,甚至說不可避免的。通常數據量較少的時候,很難遇到效率的影響。但是當數據量較大時,一個普通的分頁sql能讓你惡心到家。
我們常用的分頁sql如下:
1 SELECT * FROM table_name LIMIT 20 OFFSET 10;
這個sql不會耗時很久,因為偏移量offset很小,但是當offset很大時,這個sql的執行時間完全超乎你的想象,網上有很多測試的例子,這里不再復制粘貼。另外一個因素就是我們在查詢數據的時候,通常不會查詢過多的頁數,一般也就看幾頁而已,所以不會出現這樣的問題。所以寫這篇博客的目的不是為了解決問題,而是希望能夠養成一個好習慣,分頁的sql到底該怎么寫。
這里說一個額外的話,很多新人一直不理解,建表的時候為什么一定要有主鍵id,如果僅僅是為了非空唯一,完全可以自定義一個非空唯一的字段。mysql會為主鍵添加一個主鍵的索引,這個索引在查詢數據的時候很有幫助,所以最好為你的表添加主鍵。這里我們也用主鍵來解決這個問題。
推薦方式1:
1 SELECT * FROM table_name t1 JOIN (SELECT id FROM table_name ORDER BY id LIMIT 10 OFFSET 200) t2 ON t1.id = t2.id
將分頁的壓力通過主鍵的索引來解決,在子查詢中完成分頁條件。
推薦方式2:
1 SELECT * FROM table_name WHERE id >= (SELECT id FROM table_name ORDER BY id LIMIT 1 OFFSET 200) LIMIT 10
依然是將分頁的壓力通過主鍵索引來解決,可見主鍵的重要性。我這里的id是bigint自增的,所以可以用>=來判斷,如果是字符串,改成IN即可。不過不推薦字符串作為id,而且IN的效率也一般般,考慮方式1不錯。
這里著重說一下,為什么子查詢要有order by,網上很多例子都沒有的。select * from table_name limit 1返回的是數據庫的第一條數據,但是select id from table_name limit 1未必返回的是第一條數據,id未必是最小的。默認的排序規則應該與查詢結果有關系,這里也僅僅是猜測而已,建議limit還是與order by一起用更好一些。
這里沒有講什么技術,只是一個小小的技巧而已,希望以后寫分頁的時候能夠采用這兩種方式,避免最原始的。良好的習慣會為你避免很多意想不到的問題!
總結
以上是生活随笔為你收集整理的mysql分页查询减轻压力_mysql分页查询优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual C#的Excel编程
- 下一篇: 删除mysql会不会留下痕迹_MySQL