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

時間 2022-04-11 22:44:34

1樓:匿名使用者

帶條件的count,幾乎沒有優化的機會,如果寫成select count(1) from table where city like '%揚州%'; 會有幾乎感覺不到的速度提公升

2樓:匿名使用者

城市單獨建成乙個表,你要查詢這個表只記錄city_id,然後給這個city_id建索引。

3樓:

盡量不要有條件,可以以此條件生成張臨時表,count(*)因該是最優化選擇了

4樓:愛可生雲資料庫

我們知道,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 查詢效率緩慢

5樓:匿名使用者

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

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

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

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

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

6樓:ぷ親伱メ尐嘴

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

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

請點選輸入**描述

mysql資料庫如何提高查詢效率,單錶記錄數有幾億條,指定索引效率還是很慢 100

8樓:

mysql單錶幾條資料,你這麼複雜的sql還能出得來已經很不錯了。可以考慮分表分庫了,mysql單錶資料到千萬級別效能就下降,。單錶這麼大的資料,怎麼優化都會有點點慢。

mysql 多表聯查的統計超慢, 50w 條資料的表 和 4k 條資料的表 多表聯查 count 很慢 20

9樓:阿曜看世界

朋友,我看了1樓同事的回答挺不錯的,感覺你確實問題沒表達的很清楚,其實快慢有時候是無法避免的,我們只能盡可能的去優化,你試一試吧left join 改成join只求關聯表的交集,可以在a聯b後去掉左聯不匹配的大量資料後 再拿(a聯b) join c, 最後的記錄條數會少很多,這個時候count(0)可能會能優化一下吧。

10樓:匿名使用者

能具體點嗎?快慢很可能只是個人感受,即使給出精確時間還要考慮硬體效能才能確定快慢。

有些查詢就是很慢的,你這個50萬主表加4k驅動表對於mysql來說也算是很經典的了。

至於優化,如果你就是想查count,就根本沒必要做關聯查詢

select count(*) from a where exists (......) 這是兩表的

count(主鍵) count(*) count(0) 速度上你就當沒區別就好了,不要迷信某些教條的東西

a b 調換一下位置試試

select count(*) from b

left join c on (b.c_id = c.c_id)

left join a on (b.b_id = a.b_id)

11樓:

select count(*) from (select *

from a left join b on (a.b_id = b.b_id) left join c on (b.c_id = c.c_id)) d;

這樣寫試試,還有 你有加索引嗎? 沒有的話加下索引會快很多

mysql 為什麼 count 這麼慢

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

12樓:匿名使用者

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

13樓:匿名使用者

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

14樓:匿名使用者

請查詢我送給你的書!!

15樓:愛可生雲資料庫

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

請點選輸入**描述

sql語句分頁查詢如何同時返回記錄總條數

如下 declare total int select total count from mediapack m left join metadatarecord b on m.id b.mediapackid where m.discbarcode is not null and m.name l...

蘋果手機查詢行蹤位置記錄如何查詢

以iphone 7手機為例,查詢方法如下 一 首先在iphone 7手機桌面上點選 設定 二 進入設定後,選擇 隱私 選項。三 然後找到 定位服務 一項並點選進入。四 進入以後選擇 系統服務 選項。五 然後點選 常去地點 進入。六 進入以後即可檢視到行蹤位置記錄了。以iphone 7 plus手機為...

如何查詢個人信用記錄,如何查詢個人徵信記錄?

不管我們通過什麼渠道查詢,無非就是想知道徵信情況 個人信用記錄是儲存在人行徵信系統裡面,您可以嘗試登入中國人民銀行徵信中心 查詢信用報告 請您點選這裡 https ipcrs.pbccrc.org.cn 查詢個人信用記錄 目前部分城市也可以通過我行櫃檯和專業版查詢個人信用報告 暫不收取費用 央行個人...

怎樣查詢醫保繳費記錄

從事井下 高空 高溫 特別繁重體力勞動或其他有害身體健康工作 以下稱特殊工種 的,退休年齡為男年滿55周歲 女年滿45周歲 因病或非因工致殘,由醫院證明並經勞動鑑定委員會確認完全喪失勞動能力的,退休年齡為男年滿50周歲 女年滿45周歲。特殊工種提前退休的辦理程式。一 凡要求按特殊工種提前退休的人員,...

怎麼查詢車子的維修記錄和出險記錄

笑九創作 行駛證上可以看到車輛的基本資訊,此外,到保險公司把行車證交給他們,就可以查詢到這車輛的保險資訊。如果要把保險過戶到自己名下,就必須到保險公司進行變更,保險公司下批單後才能生效,把保險單上的發動機號與車架號進行核對,車牌號過戶就是變更過了,但這兩個號是車輛終身的 不會變的。保險理賠 是指在保...