mysql中分頁查詢有兩種方式, 一種是使用count(*)的方式,具體**如下
1
2
3
select count(*) from foo where b = 1;
select a from foo where b = 1 limit 100,10;
1
另外一種是使用sql_calc_found_rows
1
2
select sql_calc_found_rows a from foo where b = 1 limit 100, 10;
select found_rows();
第二種方式呼叫sql_calc_found_rows之後會將where語句查詢的行數放在found_rows()之中,第二次只需要查詢found_rows()就可以查出有多少行了。
下面看效率。這個非常重要,分頁操作在每個**上的使用都是非常大的,查詢量自然也很大。由於無論哪種,分頁操作必然會有兩次sql查詢,於是就有很多很多關於兩種查詢效能的比較:
sql_calc_found_rows真的很慢麼?
to sql_calc_found_rows or not to sql_calc_found_rows?
老王這篇文章裡面有提到乙個covering index的概念,簡單來說就是怎樣才能只讓查詢根據索引返回結果,而不進行表查詢
具體看他的另外一篇文章:
mysql之covering index
MYSQL的慢查詢兩個方法
對於排查問題找出效能瓶頸來說,最容易發現並解決的問題就是mysql的慢查詢以及沒有得用索引的查詢。方法一 mysql5.0以上的版本可以支援將執行比較慢的sql語句記錄下來。mysql show variables like long 注 這個long query time是用來定義慢於多少秒的才算...
MySQL分頁查詢 分組遇到的兩個問題
一 分頁查詢時排序的字段重複,導致資料重複和丟失 原因 如果列中的多個行具有相同的值order by,則伺服器可以按任何順序自由返回這些行,這些行的排序順序相對於無序列是不確定的。結論 不能依賴mysql的預設排序,排序的字段資料重複可以增加排序的字段,來提高排序的唯一性。資料庫核心月報 mysql...
mysql 合併兩個查詢結果
顯然,查詢結果的time為主鍵,目的是將兩個查詢結果合成乙個結果。如果在 中實現,一次便利乙個表新增到另外乙個表中,效率非常低。那麼在mysql 中實現方式為 出金 withdraw select from select date complete time as time,sum amt as a...