待优化表信息:
| 配置 | 字段数 | 记录数 | 引擎 | 有无索引 |
|---|---|---|---|---|
| 4CPU-16GRAM | 27 | 1719647 | InnoDB | 无 |
| 1CPU-1GRAM | 27 | 1719647 | InnoDB | 无 |
无WHERE的COUNT(*)优化
>>> SELECT COUNT(*) FROM table_name
用上面的sql查询所有记录条数的时候发现速度非常慢,约30+s
>>> EXPLAIN SELECT COUNT(*) FROM table_name

- 首先将主键长度设置为32,并新建一个索引


查询速度降至7.494s
- 再次进行优化,添加一个自增的主键列,用它进行索引



查询速度降至0.410s
来一个对比
| 配置 | 记录数 | 字段数 | 原始速度 | 第一次优化 | 第二次优化 |
|---|---|---|---|---|---|
| 4CPU-16GRAM | 1719647 | 27 | 5.351s | 0.342s | 0.311s |
| 1CPU-1GRAM | 1719647 | 27 | 34.239s | 7.494s | 0.410s |
有WHERE的COUNT(*)优化
>>> SELECT COUNT(*) FROM table_name WHERE DAY(update_date) = 25 AND MONTH(update_date) = 3 AND YEAR(update_date) = 2020;
添加自增主键后,count(*)的速度有了大幅提升,但是在某个字段上的速度还是非常慢,约40s

给update_date添加索引后

速度下降至0.5s

来一个对比
| 配置 | 记录数 | 字段数 | 原始速度 | 优化 |
|---|---|---|---|---|
| 4CPU-16GRAM | 1719647 | 27 | 0.605s | 0.386s |
| 1CPU-1GRAM | 1719647 | 27 | 39.384s | 0.464s |

本文分享了在不同配置下,通过创建索引和调整表结构,大幅提升了COUNT(*)查询效率的经验,尤其是在大型数据集上,优化后的查询速度从数十秒缩短至不到一秒。
2357

被折叠的 条评论
为什么被折叠?



