MYSQL查詢資料的同時準確地查出記錄數

2021-09-10 22:56:13 字數 812 閱讀 4562

生產環境中經常會出現需要查詢資料的同時查詢資料總數,然後根據總數來進行分頁或其他操作。如果分成兩個sql會出現問題,就是查詢到記錄後總數也發生了變化。

如查詢所有狀態為1的記錄.

select * from t1 where status = 1;

select count(*) from t1 where stauts = 1;

第一條sql查詢出10條資料,而第二條查詢出的count可能只有9條或者11條。當二者不在乙個事務中時,由於沒有innodb可重複讀級別來解決幻讀問題,所以會出現二者不一致。

使用sql_calc_found_rows和select found_rows()來解決這個問題。

select sql_calc_found_rows id, status from t1 where status = 1;

select found_rows();

其中sql_calc_found_rows 告訴mysql將sql所處理的行數記錄下來,found_rows() 則取到了這個紀錄。sql_calc_found_rows只會保留上一條sql的行數,如果執行了其他sql就失效了。

雖然也是兩個語句,但是只執行了一次主查詢,看起來效率比較高。

當執行分頁查詢時,往往會加limit,limit會限制mysql掃瞄的行數。 然而,當我們使用sql_calc_found_rows時,mysql會強制掃瞄所有滿足條件的行數,才能獲取到總數。我個人的理解是將有limit的sql變成了沒有limit的sql。兩條小sql(limit查詢和count查詢)變成了乙個大sql。生產環境慎用,我覺得還是通過可重複讀級別解決不一致問題,分解為2個sql。

如何快速且準確地運用搜尋引擎查詢資料

此文僅是筆者的一些個人經驗,或許並不適用於大家,還請多多包涵 眾所周知,在這個領域,資訊量是相當大的,這就引出了乙個問題,如何快速查到想要的資料?首先我們需要描述清楚我們的問題並用搜尋引擎進行搜尋 一般我們都會使用以下兩種描述方式 1 描述問題專有名稱 例如 音效卡異常 這種方式可以幫助你找到較為專...

mysql同時查多個庫 資料庫同時查詢多個表

我在同乙個資料庫下建立了三個表 1,表 project projectid projectname 2,表 position positionid positionname 3,表 work workid workprojectid workpositionid workamount worktim...

mysql進行分頁查詢資料不準確問題分析

新功能上線發現分頁出現了問題,分析了一段時間發現是mysql的問題,mysql對欄位相同值排序後再分頁資料會不準確。例子使用的mysql版本是5.6.31 舉個簡單的例子,資料表t如下 ab 1122 3344 5562 7282 select a,b from t order by b limit...