• 一、前言
  • 二、关于 count 的优化
  • 三、使用 explain 获取行数
  • 1、关于 explain
  • 2、关于返回值

一、前言

这个问题是今天朋友提出来的,关于查询一个 1200w 的数据表的总行数,用 count(*) 的速度一直提不上去。找了很多优化方案,最后另辟蹊径,选择了用 explain 来获取总行数。

二、关于 count 的优化

网上关于 count() 优化的有很多。博主这边的思路就是没索引的就建立索引关系,然后使用 count(1) 或者 count() 来提升速度。这两个函数默认使用的是数据表中最短的那个索引字段。我朋友这边因为表中只有一个索引字段,所以使用 count(1) 和 count() 没什么区别。

MySQL 中聚合函数 count 的使用和性能优化

()

mysql count(*) 会选哪个索引?

()

大家可以参考这两个博客,都挺不错的。

三、使用 explain 获取行数

1、关于 explain

关于 explain,使用 mysql 的都知道,这个函数是专门用于查看 sql 语句的执行效率的,网上可供参考的文章很多。

定义:explain 命令速度很快,因为 explain 用并不真正执行查询,而是查询优化器【估算】的行数。

我们使用 explain 之后,会看到返回很多参数,其中:

**rows:显示 MySQL 认为它执行查询时必须检查的行数。**就是这个东西了,既然我们要获取的是数据表的行数,那么可以使用:

mysql减法聚合 mysql聚合函数优化_数据库

2、关于返回值

以前博主也没注意过返回值的问题,都是直接通过 phpmyadmin 来查看 sql 的执行效率。这次因为要用到 rows 的值,所以就打印了一下,原来这个 explain 函数是会返回一个数组。这样我们就能通过这个数组获取到我们需求的 rows。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GyQbhIHR-1659445213085)(https://mmbiz.qpic.cn/mmbiz_png/JdLkEI9sZfd46f1eR2Esd6meiaSoaLBP1icxgrvhE8U7esjVE9nq83VvxyCfHvOfMHEicZCfSDMVic0ibBwuuEPsUcw/640?wx_fmt=png)]

这里直接获取这个值即可。速度极快。原来查询速度是 2.33s, 换成只用 explain 之后,速度仅为 0008s,提升十分巨大。