亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

您好,求問在mysql中的count(*)的問題,請問該怎么解決?

您好,求問在mysql中的count(*)的問題,請問該怎么解決?

慕田峪4524236 2021-12-02 11:07:39
在php中,我用: $sql = "SELECT COUNT(*) FROM forum_user";$db->Execute($sql);語句獲得了行的數目,但怎么把這個數目用echo結構把查詢結果COUNT(*) 輸出來呢?
查看完整描述

2 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

$sql ="SELECT COUNT(*) as c FROM forum_user";
$result=mysql_query($sql);
$count =mysql_result($result,0,"c");
輸出$count 就可以了

查看完整回答
反對 回復 2021-12-05
?
楊__羊羊

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。所以最大的缺點還是第一點。

  • 從 warnings 信息看,這種是 MySQL 8.0 之后要淘汰的語法。

    3. 從數據字典里面拿出來粗略的值


    那這樣的適合新聞展示,比如行數非常多,每頁顯示幾行,一般后面的很多大家也都不怎么去看。缺點是數據不是精確值。

    4. 根據表結構特性特殊的取值

  • 這里假設表 ytt1 的主鍵是連續的,并且沒有間隙,那么可以直接  mysql> select max(id) as cnt from ytt1;    +------+    | cnt  |    +------+    | 3072 |    +------+    1 row in set (0.00 sec)


  • 不過這種對表的數據要求比較高。


    5. 標準推薦取法(MySQL 8.0.17 建議)

  • 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



查看完整回答
反對 回復 2021-12-05
  • 2 回答
  • 0 關注
  • 382 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號