1.模擬MyISAM的計數器如表ytt1。為了獲得總數,我們設置了兩個觸發器來記錄對表ytt1_count的插入/刪除,因此我們只需查詢表ytt1_count就可以獲得總數。Ytt1_count這個表足夠小,可以長時間固化成內存。但缺點是ytt1的每個操作都有冗余的觸發器,降低了寫性能。這裏有壹個權衡。
2.使用MySQL的sql_calc_found_rows特性進行隱式計算。
它仍然是表ytt1,但是sql_calc_found_rows和found_rows()用於在每次查詢時獲取總數,例如:
集合中的1行,1警告(0.00秒)
這樣做的好處是編寫簡單,使用MySQL自己的語法。缺點也有,大概兩點:1。Sql_calc_found_rows是全表掃描。2.found _ rows()函數是語句級存儲,具有很大的不確定性。所以在MySQL主從架構中,語句級行級格式的從數據可能不準確。但是,將行記錄格式更改為行是可以的。所以最大的弊端就是第壹點。
根據警告信息,這是MySQL 8.0以後要淘汰的語法。
3.從數據字典中取出粗略值
那適合新聞展示,比如有很多行,每頁顯示幾行。壹般很多人都不去看。缺點是數據不是壹個精確的值。
4.特殊值根據表的結構特征而定。
假設表ytt1的主鍵是連續的,沒有間隔,那麽可以直接?mysql & gt從ytt1中選擇max(id)作為cnt+ - + | cnt?| + - + | 3072 | + - + 65438+集合中的0行(0.00秒)
不過這類表格數據要求比較高。
5.標準推薦方法(MySQL 8.0.17建議)
MySQL 8.0建議使用常規的編寫方法。
第五種寫法是MySQL 8.0.17推薦的,也就是說以後大部分場景都可以直接實時計算。MySQL 8.0.17及以後的版本都取消了sql_calc_found_rows特性,所以可以用第二種方法查看警告信息。與MySQL 5.7相比,8.0優化了count(*),所以不需要使用第二種寫法。讓我們看看在這種查詢中8.0是否比5.7好。MySQL 5.7
請點擊輸入圖片說明。