2 回答

TA貢獻1155條經驗 獲得超0個贊
$sql ="SELECT COUNT(*) as c FROM forum_user";
$result=mysql_query($sql);
$count =mysql_result($result,0,"c");
輸出$count 就可以了

TA貢獻1943條經驗 獲得超7個贊
我們知道,MySQL 一直依賴對 count(*) 的執行很頭疼。很早的時候,MyISAM 引擎自帶計數器,可以秒回;不過 InnoDB 就需要實時計算,所以很頭疼。以前有多方法可以變相解決此類問題,比如:
1. 模擬 MyISAM 的計數器比如表 ytt1,要獲得總數,我們建立兩個觸發器分別對 insert/delete 來做記錄到表 ytt1_count,這樣只需要查詢表 ytt1_count 就能拿到總數。ytt1_count 這張表足夠小,可以長期固化到內存里。不過缺點就是有多余的觸發器針對 ytt1 的每行操作,寫性能降低。這里需要權衡。
2. 用 MySQL 自帶的 sql_calc_found_rows 特性來隱式計算
依然是表 ytt1,不過每次查詢的時候用 sql_calc_found_rows 和 found_rows() 來獲取總數,比如:
1 row in set, 1 warning (0.00 sec)
這樣的好處是寫法簡單,用的是 MySQL 自己的語法。缺點也有,大概有兩點:1. sql_calc_found_rows 是全表掃。2. found_rows() 函數是語句級別的存儲,有很大的不確定性,所以在 MySQL 主從架構里,語句級別的行級格式下,從機數據可能會不準確。不過行記錄格式改為 ROW 就 OK。所以最大的缺點還是第一點。
這里假設表 ytt1 的主鍵是連續的,并且沒有間隙,那么可以直接 mysql> select max(id) as cnt from ytt1; +------+ | cnt | +------+ | 3072 | +------+ 1 row in set (0.00 sec)
MySQL 8.0 建議用常規的寫法來實現。
第五種寫法是 MySQL 8.0.17 推薦的,也就是說以后大部分場景直接實時計算就 OK 了。MySQL 8.0.17 以及在未來的版本都取消了sql_calc_found_rows 特性,可以查看第二種方法里的 warnings 信息。相比 MySQL 5.7,8.0 對 count(*) 做了優化,沒有必要在用第二種寫法了。我們來看看 8.0 比 5.7 在此類查詢是否真的有優化?MySQL 5.7
從 warnings 信息看,這種是 MySQL 8.0 之后要淘汰的語法。
3. 從數據字典里面拿出來粗略的值
那這樣的適合新聞展示,比如行數非常多,每頁顯示幾行,一般后面的很多大家也都不怎么去看。缺點是數據不是精確值。
4. 根據表結構特性特殊的取值
不過這種對表的數據要求比較高。
5. 標準推薦取法(MySQL 8.0.17 建議)
添加回答
舉報