
uid int // 用户 id account_id int // 子账号 id flow bingint // 量消耗 ip char // 本机 ip address varchar // 请求地址 现在需要查询当日的用户流量使用情况。account_id 可以为 0 或者大于 0 。 
表 abc_http_detail_log_2024_04_13 有 2075w 条数据,uid=114708 的数据量最多,有 637w 条。在统计流量消耗时出现上图的情况。如何才能优化查询呢?
1 YouZiAndDanJuan 2024-04-15 15:59:39 +08:00 分表 |
2 I2E OP 有两点疑问: 1 ,为什么加了 account_id > 0 会导致第二条 sql 的索引失效 2 ,为什么加了 limit 索引又会生效 |
3 I2E OP @YouZiAndDanJuan 分表要改很多屎山代码 |
4 bianhui 2024-04-15 16:23:10 +08:00 无语,你看看字只看一半么,using index 和 using inex condition 是两个东西。百度搜下索引下推。 |
5 xlzyxxn 2024-04-15 17:06:35 +08:00 @I2E #2 应该有个 uid 、account_id 、flow 的联合索引吧,第二条查询条件 adress 需要回表,uid=114708 占了大部分数据的情况下,mysql 认为不如直接去全表扫描。第三条查询不需要回表。 |
6 jshfsym42 2024-04-16 09:28:51 +08:00 第二条 SQL 匹配的行数太多了,MySQL 执行器认为不如全盘扫描;可以看看这个。 https://dev.mysql.com/doc/refman/8.0/en/table-scan-avoidance.html You are using a key with low cardinality (many rows match the key value) through another column. In this case, MySQL assumes that by using the key probably requires many key lookups and that a table scan would be faster. |
7 8355 2024-04-16 09:57:00 +08:00 account_id+ 一般索引 你的日志表在查询某一个 id 的时候跳行太多了,加上某 uid 和 account_id orderby 即可。 |
8 coderzhangsan 2024-04-16 16:25:20 +08:00 能说下 mysql 版本吗?版本不同,可能导致优化的结果也是不同的。 |
9 I2E OP @coderzhangsan 8.0.25 |