Home >Backend Development >PHP Tutorial >MySQL单表500W条数据统计查询,求个高性能方法

MySQL单表500W条数据统计查询,求个高性能方法

WBOY
WBOYOriginal
2016-06-06 20:48:401609browse

有一张表,500W条记录,4个字段如下:

<code>id int primary key
ip int
class_a varchar
class_b varchar
</code>

需要执行的查询语句结果是:

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

目前按照上述语句执行,性能几乎为零。 求大神给点优化意见。

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

回复内容:

有一张表,500W条记录,4个字段如下:

<code>id int primary key
ip int
class_a varchar
class_b varchar
</code>

需要执行的查询语句结果是:

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作为维度再创建两个表

<code>class_a_id, class_a_content

class_b_id, class_b_content
</code>

原来500w数据的那个表中只保存class_a_idclass_b_id, 最后连表查询就像你上面那样就可以了

看一下执行计划,你对所有行内容统计,索引估计不能起效,索引读取的时候是有序的,比较1,2,3,4,他会先读1再读2再读3. 4。。。,但是全表扫描的话可以按数据块进行,所以有可能索引是不需要

可以尝试组合索引,create index indextable ON table (class_a,class_b,id)

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn