有一張表,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_a和class_b作為維度再建立兩個表
class_a_id, class_a_contentclass_b_id, class_b_content
原來500w資料的那個表中只儲存class_a_id和class_b_id, 最後連表查詢就像你上面那樣就可以了
看一下執行計畫,你對所有行內容統計,索引估計不能起效,索引讀取的時候是有序的,比較1,2,3,4,他會先讀1再讀2再讀3. 4。。。,但是全表掃描的話可以按資料區塊進行,所以有可能索引是不需要
可以嘗試複合式索引,create index indextable ON table (class_a,class_b,id)