84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
有一张表,500W条记录,4个字段如下:
id int primary key ip int class_a varchar class_b varchar
需要执行的查询语句结果是:
SELECT class_a,class_b,count(DISTINCT ip) FROM table GROUP BY class_a, class_b
目前按照上述语句执行,性能几乎为零。 求大神给点优化意见。
ip,class_a,class_b都加过索引了。
ip
class_a
class_b
u could add commonly index ,eg: "alert tabledbname.tableadd index (classa,classb)", and you can useexplainto synatx.
dbname
table
classa
classb
explain
针对你的sql, 按我的理解, 建复合索引(classa, classb, ip), explain应该可以看到Using index for group-by, 这样就可以走 覆盖索引. 否则... 还不如直接Using temporary; Using filesort
500w条算比较大了,如果你想要提升速度上去,你估计要用索引覆盖可能会提升点速度。也可以考虑下分表。
把class_a和class_b作为维度再创建两个表
class_a_id, class_a_content class_b_id, class_b_content
原来500w数据的那个表中只保存class_a_id和class_b_id, 最后连表查询就像你上面那样就可以了
class_a_id
class_b_id
看一下执行计划,你对所有行内容统计,索引估计不能起效,索引读取的时候是有序的,比较1,2,3,4,他会先读1再读2再读3. 4。。。,但是全表扫描的话可以按数据块进行,所以有可能索引是不需要
可以尝试组合索引,create index indextable ON table (class_a,class_b,id)
create index indextable ON table (class_a,class_b,id)
u could add commonly index ,eg: "alert table
dbname
.table
add index (classa
,classb
)", and you can useexplain
to synatx.针对你的sql, 按我的理解, 建复合索引(classa, classb, ip), explain应该可以看到Using index for group-by, 这样就可以走 覆盖索引. 否则... 还不如直接Using temporary; Using filesort
500w条算比较大了,如果你想要提升速度上去,你估计要用索引覆盖可能会提升点速度。也可以考虑下分表。
把
class_a
和class_b
作为维度再创建两个表原来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)