mysql count速度慢,mysql count 查詢效率緩慢

2022-03-03 09:35:45 字數 5000 閱讀 2423

1樓:

第一,建立搜尋條件對應的索引

第二,採用物化檢視,提前將資料查詢出來

第三,升級sql版本,sql2008比sql2000的速度提高是很多的

第四,如果表有大容量的欄位,如 **,文件,應該考慮用ftp來做,不是把資料放在資料庫第五,提高電腦效能

2樓:愛可生雲資料庫

我們知道,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

請點選輸入**描述

mysql count 查詢效率緩慢

3樓:匿名使用者

可以嘗試建立一下索引來看看。

也就是 看看 你 where 後面,都是哪些條件。

然後把哪些條件的列, 建立一個索引。

注意:如果是 列 like '%引數%' 這樣的, 就別建立索引了。

還有就是 函式( 列 ) = 引數 這樣的, 也別建立索引了。

4樓:ぷ親伱メ尐嘴

where 的那個條件最好用主鍵來查,如果不能用主鍵,那這一列必須加索引啊。

5樓:愛可生雲資料庫

我們知道,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

請點選輸入**描述

mysql count 查詢記錄總條數,效率很慢

6樓:匿名使用者

只記錄一列的總條數會快點count(列名)。或者where條件改為city like '%揚州' or city like '揚州%',city like '%揚州%' 是進行全表查詢,修改後是兩個範圍的掃描,效能也能提高一些,你試一試。還可以使用索引。

7樓:匿名使用者

city like '%揚州%'修改為locate( '%揚州%',city)>0,稍微能提高模糊查詢效率至於count,mysql貌似沒有多大的優化,最多可以嘗試count(1)的方式,但從執行計劃來看,基本沒太大區別

8樓:匿名使用者

請查詢我送給你的書!!

9樓:愛可生雲資料庫

我們知道,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

請點選輸入**描述

思考速度慢

思考速度是衡量思考質量或思考品質的重要維度和方面。思考速度並不是越慢越好,也不是越快越好。思考速度慢的弊端當然很明顯,不管是工作中 生活中和還是學習中,思考速度慢了會影響工作效率。當然思考速度快了有諸多好處,但也好出現考慮不周全的情況。思考速度慢的原因一般包括 一是,個人性格特徵,或是長期養成的習慣...

電腦速度慢

遊戲也要升級,每升級一次,可能對電腦的硬性要求就要更高。你電腦的記憶體不是很高,建議升級到1g。你還說開啟網頁的速度也變慢,那你就要注意清理你的電腦了。用優化工具可以搞定!還有,來一次全盤防毒,病毒也會引起機器速度變慢!好運!電腦用久了,就會有越來越多的垃圾檔案,登錄檔錯誤,定期清理是維護電腦長期穩...

電腦開機速度慢,電腦開機速度慢的原因及解決方法

應該不會有什麼影響的。可能就是你軟體安裝多了。而且開機啟動的軟體也多,系統開機要預快取的,那就變慢了。在 執行 裡輸入msconfig,在 啟動 把不用的軟體勾打掉吧。還有要多清楚系統快取。如果你想偷懶,安裝個 windows優化大師 吧。這些很容易幫你辦好的。如果你決議要想啟動條很快走完,那也可以...