MySQL單表500W條資料統計查詢,求個高效能方法

來源:互聯網
上載者:User
有一張表,500W條記錄,4個欄位如下:

id int primary keyip intclass_a varcharclass_b varchar

需要執行的查詢語句結果是:

SELECT class_a,class_b,count(DISTINCT ip) FROM table GROUP BY class_a, class_b

目前按照上述語句執行,效能幾乎為零。求大神給點最佳化意見。

ip, class_a, class_b 都加過索引了。

回複內容:

有一張表,500W條記錄,4個欄位如下:

id int primary keyip intclass_a varcharclass_b varchar

需要執行的查詢語句結果是:

SELECT class_a,class_b,count(DISTINCT ip) FROM table GROUP BY class_a, class_b

目前按照上述語句執行,效能幾乎為零。求大神給點最佳化意見。

ip, class_a, class_b 都加過索引了。

u could add commonly index ,eg: "alert table dbname.table add index (classa, classb)", and you can use explain to synatx.

針對你的sql, 按我的理解, 建複合索引(classa, classb, ip), explain應該可以看到Using index for group-by, 這樣就可以走 覆蓋索引. 否則... 還不如直接Using temporary; Using filesort

500w條算比較大了,如果你想要提升速度上去,你估計要用索引覆蓋可能會提升點速度。也可以考慮下分表。

class_aclass_b作為維度再建立兩個表

class_a_id, class_a_contentclass_b_id, class_b_content

原來500w資料的那個表中只儲存class_a_idclass_b_id, 最後連表查詢就像你上面那樣就可以了

看一下執行計畫,你對所有行內容統計,索引估計不能起效,索引讀取的時候是有序的,比較1,2,3,4,他會先讀1再讀2再讀3. 4。。。,但是全表掃描的話可以按資料區塊進行,所以有可能索引是不需要

可以嘗試複合式索引,create index indextable ON table (class_a,class_b,id)

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.