mysql - select count(1) 统计太慢,怎么优化?
高洛峰
高洛峰 2017-04-17 13:35:16
0
1
1135

我有一张表400w+数据,单表查询都很慢,当关联时就更慢了。 请问还有什么可以优化的方法吗?

mysql> select count(1) from test;
count(1)
+----------+
4429754

1 row in set (1.39 sec)

单表统计需要这么长时间。按时间段查询,也一样很慢。

mysql> select count(1) from test f where f.createdDate >= '2015-01-01 00:00:00' and f.createdDate <= '2015-12-15 23:59:59';
count(1)
+----------+
2584387

1 row in set (1.08 sec)

createdDate是datetime类型,我按年份分区过。
ALTER TABLE test PARTITION BY RANGE(to_days(createdDate))(
PARTITION p20120101 VALUES LESS THAN (to_days('2012-01-01 00:00:00')),
PARTITION p20130101 VALUES LESS THAN (to_days('2013-01-01 00:00:00')),
PARTITION p20140101 VALUES LESS THAN (to_days('2014-01-01 00:00:00')),
PARTITION p20150101 VALUES LESS THAN (to_days('2015-01-01 00:00:00')),
PARTITION p20160101 VALUES LESS THAN (to_days('2016-01-01 00:00:00')),
PARTITION p20170101 VALUES LESS THAN (to_days('2017-01-01 00:00:00'))
);

请问还有什么可以优化的吗?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
巴扎黑

你的表按年进行分区,查询时间条件也是一整年,这样虽然走了分区但是这一个分区的数据还是比较多.
你的查询业务需要有这么大的跨度吗? 是否按照你实际的查询跨度来优化一下分区方式?
如果确实有大量数据而且是存量数据,可以考虑直接把一些维度统计好放在数据库,后期查询直接查询结果,不再动态统计.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!