mysql 四百万左右数据 count(*) 49 秒才响应,求助大佬怎么优化?

2021-07-30 11:35:10 +08:00
 edk24
EXPLAIN SELECT COUNT(*) AS tp_count FROM `fa_people_check` `people_check` LEFT JOIN `fa_people` `people` ON `people_check`.`people_id`=`people`.`id` LIMIT 1;

大佬们,像这种怎么优化字段提升查询速度。 执行一次 49s 就很离谱

10221 次点击
所在节点    MySQL
55 条回复
xixihaha1
2021-07-30 11:41:08 +08:00
people_id 有索引吗
luckyrayyy
2021-07-30 11:41:18 +08:00
没看太懂,你这怎么两个表 left join 两个表?另外左关联的 count(*) 不就是左表的 count(*) 嘛?
xixihaha1
2021-07-30 11:44:15 +08:00
@luckyrayyy 什么两个表,那是表的别名
ipwx
2021-07-30 11:46:32 +08:00
@luckyrayyy AS 省略,SQL 的奇葩语法
0o0o0o0
2021-07-30 11:48:08 +08:00
people_check.people_id
people.id
需要加索引
edk24
2021-07-30 11:49:07 +08:00
@0o0o0o0 加了的
@xixihaha1

加了索引的, 因为是必须常用的字段
edk24
2021-07-30 11:49:31 +08:00
@ipwx 哈哈 直接在慢日志里 copy 的。 这个 as 是 thinkphp 框架加上的
iyaozhen
2021-07-30 11:51:38 +08:00
表结构呢? people_check 还用了表分区,是依据哪个字段分的?

还有不加条件的话 count * 貌似是比较慢,count id 啥的看看?感觉这个 sql 想干什么不明确
ledkk
2021-07-30 11:54:08 +08:00
people_check 是一个分区表? 分区的方式是什么样子的? 分区表不带分区字段,查询肯定会非常慢了。

people 表只有一条记录么? 如果是的话,或者记录条数很少的话,就没必要做 join 了,可以考虑用 in 替换一下
edk24
2021-07-30 11:54:37 +08:00
@iyaozhen 分区是原先想的替代方案,结果太麻烦 而且并没有什么好处没用了, 现在只想好好优化这个 sql 。

这个 sql 是查询数据 limit 前后,要返回数据总数, 用来分页
SjwNo1
2021-07-30 11:55:49 +08:00
上面的索引明显加了啊。。
查看下 join_buffer_size 值吧,适当调整看看,不要 count(*),先试试看
iyaozhen
2021-07-30 11:56:50 +08:00
@edk24 那你得把分区去掉呀,不然会有影响的
iyaozhen
2021-07-30 12:05:51 +08:00
@edk24 总数的话和 count people_check 这个表没啥区别?
myd
2021-07-30 12:17:17 +08:00
1. 给 people_check 加一个 people_id 普通索引
2. 给 fa_people 的 id 字段加一个唯一索引(已有主键索引的情况下,再加一个唯一索引)
myd
2021-07-30 12:17:37 +08:00
SQL 不用改
Jooooooooo
2021-07-30 12:42:46 +08:00
最好是增量的 count
klesh
2021-07-30 12:55:26 +08:00
索引对 where 和 order 有帮助,对 count 没有直接影响,因原理上需要遍历所有结果集里面的行。
可用 trigger 维护一个变量或定时 count 的方式绕过。
liuxu
2021-07-30 13:00:15 +08:00
这是索引的事吗,这是 join 出 temp 表做 count 的事啊。。
wellsc
2021-07-30 13:00:38 +08:00
单独搞个字段增量去记录 count
JJsty1e
2021-07-30 13:07:19 +08:00
你左表一条数据会对应右表多条数据吗?如果没有的话,就直接 count 左表吧没必要 left join 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/792656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX