mysql大表中count()的用法以及mysql中count()的優化

2020-12-12 百家號

本篇文章給大家帶來的內容是關於mysql大表中count()的用法以及mysql中count()的優化,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

一個單表中包含有6000w+的數據,然而你又不能拆分.需要分別統計表中有多少數據,A產品有多少,B產品有多少這幾個數據.

在為優化之前.表結構如下,為了隱藏內容我將相應欄位做了模糊化處理.

CREATE TABLE `xxxx` (

`link` varchar(200) DEFAULT NULL,

`test0` varchar(500) DEFAULT NULL,

`test1` varchar(50) DEFAULT NULL,

`test2` int(11) DEFAULT NULL,

`test3` varchar(20) DEFAULT NULL,

`test4` varchar(50) DEFAULT NULL,

`test5` varchar(50) NOT NULL,

`inserttime` datetime DEFAULT NULL,

`test6` bit(1) NOT NULL DEFAULT b'0',

`A` bit(1) NOT NULL DEFAULT b'0',

`B` bit(1) NOT NULL DEFAULT b'0' ,

PRIMARY KEY (`test5`),

KEY `test6` (`test6`) USING BTREE,

KEY `A` (`A`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

這個一個常規的InnoDB的表格,所以它的count(*)比起MyISAM的效率慢很多,InnoDB所顯示的row的行數不很準確,所以在這這裡我需要統計一下.有這麼幾個策略.共計61500000數據

count(*) 耗時 1539.499s

count(1) 耗時 907.581s

count(A) 對索引進行count.

count(test6) 對主鍵進行count.

無一例外,由於這個表沒有優化好上面無論哪一種都需要幾千秒的時間,這個是我們無法忍受的.

下面我們開始著手分析處理這個問題.

預期整個表的count(*)應該在200s以內為正常,100以內為良好,50以內為優秀.

首先我將裡面test6抽取了出來,單獨形成了一個表.對其進行操作.共計61500000數據

count(*) 耗時10.238s

count(1) 耗時8.710s

count(test6) 對主鍵進行count.耗時12.957s

其中

count(1)

的效率最高,比最慢

count(pk)

速度提升了52.0%.

將你能確定的欄位改為最優值,例如:

varchar更為char.雖然varchar可以自動分配存儲空間的大小但是.varchar需要使用1到2個額外的字節來記錄字符串的長度,增加它的update的操作時間,

datetime改為timestamp後者在1978-2038年之間

最後使用count(1)檢驗的時候最快耗時,168s.雖然有些慢但是可以接受.

總結:

重新設計你表中的欄位,儘量優化它的長度.不要一味使用過多的varchar.

使用count(1)而不是count(*)來檢索.

關於count的詳細介紹

以上就是mysql大表中count()的用法以及mysql中count()的優化的詳細內容,更多請關注php中文網其它相關文章!

相關焦點

  • mysql中count(*)是最慢的嗎?
    count如何實現的:在mysql中,當數據表數據比較少的時候,使用count可以很快進行返回需要統計的數據行數,當數量比較大的時候,count的返回結果的速度就變慢的很多,出現這種情況時,使用的mysql存儲引擎大概率是InnoDB。因為在MyISAM引擎中,對每個表的總行數都會進行記錄,並存在磁碟上。
  • MySQL 優化案例 - select count-愛可生
    ,可以看到確實運行很慢,要 40 多秒左右,確實很不正常~mysql> select count(*) from api_runtime_log;++| count(*) |++| 5718952 |++1 row in set (42.95 sec)我們再去看下表結構,看上去貌似也挺正常的~存在主鍵,表引擎也是 InnoDB,字符集也沒問題。
  • mysql中count()太慢,我該怎麼辦
    中,count()實現原理,以及count()的各種使用方式,和他們之間的差異,以及執行效率的比較,看完之後,想必你不會在說,count(*)執行效率是最慢的了吧,經過mysql優化後的count(*)的執行效率和count(1)已經不相上下了,但是當表中的數據量很大的時候,無論何種形式的count(),執行的效率都會很低,畢竟需要逐行統計計數。
  • MySQL count(*),count(1),count(field)區別、性能差異及優化建議
    MySQL count函數是用來獲取表中滿足一定條件的記錄數,常見用法有三種,count(*),count(1),count(field),這三種有什麼區別?在性能上有何差異?本文將通過測試案例詳細介紹和分析。
  • MySQL中只會count(),sum()?累加運算沒聽過?
    這個統計sql還是花了我一小段時間的。mysql統計這個還是需要一定的技巧的。但是產品給出的需求是我們能夠提供一句sql能夠直接在可視化數據引擎中得出他要的答案。於是從上面的代碼得出靈感。mysql是否有這種變量呢?有!當然有。記得很普遍的場景,以前經常有業務需要我們輸出序號,Oracle是自帶一個偽列rownum,但是mysql沒有。mysql通常通過聲明自增變量來生成序號。
  • PHP mysql中limit用法詳解(代碼示例)
    源 / php中文網      源 / www.php.cn在MySQL中,LIMIT子句與SELECT語句一起使用,以限制結果集中的行數。LIMIT子句接受一個或兩個offset和count的參數。這兩個參數的值都可以是零或正整數。offset:用於指定要返回的第一行的偏移量。
  • 卓象程式設計師:MySQL中count的使用
    select count(*)應該是一個比較常用的語句,用來統計記錄行數。但是,慢慢地你會發現,這個語句越來越慢了,為什麼呢?MySQL 中,不同的存儲引擎,count(*)的實現方式是不同的。1、MyISAM 引擎,比較簡單粗暴,直接將表的總行數存儲在磁碟上,因此效率很高;2、InnoDB 引擎中,執行count(*)時會遍歷全表,需要一行行的把數據查出來,因此性能較差;為啥 MyISAM 就可以這樣做呢?
  • Mysql性能優化:為什麼你的count(*)這麼慢?
    導讀在開發中一定會用到統計一張表的行數,比如一個交易系統,老闆會讓你每天生成一個報表,這些統計信息少不了 sql 中的count函數。很簡單,直接將計數保存在一張表中(table_name,total)。至於執行的邏輯只需要將緩存系統中redis計數+1改成total欄位+1即可,如下圖: 由於在同一個事務中,保證了數據在邏輯上的一致性。
  • MySQL的COUNT語句,竟然都能被面試官虐的這麼慘!?
    即以下表記錄create table insert insert insert insert insert insert insert 使用語句count(*),count(id),count(id2)查詢結果如下:select count(*),count
  • mysql having的用法
    我的理解就是真實表中沒有此數據,這些數據是通過一些函數生存。SQL實例:一、顯示每個地區的總人口數和總面積.分完組後,然後用聚合函數對每組中的不同欄位(一或多條記錄)作運算。二、 顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。
  • MySQL分頁優化解析
    所以,可以試著讓mysql也存儲分頁,當然要程序配合。(這裡只是提出一個設想,歡迎大家一起討論)ASP的分頁:在ASP系統中有Recordset對象來實現分頁,但是大量數據放在內存中,而且不知道什麼時候才失效(請ASP高手指點).
  • 小王:MySQL count(1) 真的比 count(*) 快麼?
    有 Where 條件的 count,會根據掃碼結果count 一下所有的行數,其性能更依賴於你的 Where 條件,所以文章我們僅針對沒有 Where 的情況進行說明。MyISAM 引擎會把一個表的總行數記錄了下來,所以在執行 count(*) 的時候會直接返回數量,執行效率很高。
  • MySQL的四種GROUP BY用法
    > select k, count(*) c from tbl group by k order by k limit 5;+---+---+| k | c |+---+---+| 2 | 3 || 4 | 1 || 5 | 2 || 8 | 1 || 9 | 1 |+---+---+5 rows in set (0.00 sec)mysql> explain select k, count
  • MYSQL資料庫操作案例
    如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句中。mysql> SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;mysql> SELECT * from runoob_test_tbl WHERE runoob_count IS NOT NULL;mysql> SELECT
  • MySQL最常用分組聚合函數
    || MATCHES || PENALTIES || PLAYERS || TEAMS |+----+5 rows in set (0.00 sec) 1、count函數①count(*):返回表中滿足where條件的行的數量
  • MySQL資料庫測試題
    以下哪條語句用於統計test表中的記錄總數?C、在Mysql提示符下輸入以下命令mysqldump -uroot -p1234 test>d:/db.sql4、下列SQL語句中,創建關係表的是?(難度A)A、查詢user表中的所有數據B、刪除user表的數據C、刪除user表,並再次創建user表D、刪除user表10、更新
  • MySQL函數大全及用法示例(一)
    str的第count個出現的分隔符delim之後的子串(count為正數時返回左端,否則返回右端子串)  mysql> select substring_index('www.mysql.com', '
  • mysql中這樣的場景就不要用count了
    在項目開發中,大家有沒有遇到過要查詢一下資料庫中有沒有符合指定條件的數據這樣的功能呢。一定有遇到吧。那你是怎麼開發實現的呢?是用類似下面這樣的語句實現的嗎?如果表的數據量不大,那就無所謂了。但是如果表中的數據量很大的話,那就要小心了。這樣的耗時可是很大的,很容易就會把你的服務拖垮的哦。功能明明只是需要查有沒有符合條件的數據就可以,實現時卻把符合條件的所有數據的數量都統計出來了。是不是有點做得過多了呢。那到底是要怎麼做呢。
  • MySQL中的主鍵和rowid,看似簡單,其實有一些使用陷阱需要注意
    mysql> select count(*)from redis_backup_result;+----------+| count(*) |+----------+| 40944 |InnoDB表中在沒有默認主鍵的情況下會生成一個6位元組空間的自動增長主鍵,可以用select _rowid from table來查詢,如下:mysql> select _rowid from redis_backup_result limit 5;+--------+
  • MySQL 用 limit 為什麼會影響性能?
    gt; select version();+-+| version() |+-+| 5.7.17 |+-+1 row in set (0.00 sec)表結構:mysql> desc test;+---+-+-++----+-+| Field  | Type