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 233 天前
分表
|
2
I2E OP 有两点疑问:
1 ,为什么加了 account_id > 0 会导致第二条 sql 的索引失效 2 ,为什么加了 limit 索引又会生效 |
3
I2E OP @YouZiAndDanJuan 分表要改很多屎山代码
|
4
bianhui 233 天前
无语,你看看字只看一半么,using index 和 using inex condition 是两个东西。百度搜下索引下推。
|
5
xlzyxxn 233 天前
@I2E #2 应该有个 uid 、account_id 、flow 的联合索引吧,第二条查询条件 adress 需要回表,uid=114708 占了大部分数据的情况下,mysql 认为不如直接去全表扫描。第三条查询不需要回表。
|
6
jshfsym42 233 天前
第二条 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 233 天前
account_id+ 一般索引
你的日志表在查询某一个 id 的时候跳行太多了,加上某 uid 和 account_id orderby 即可。 |
8
coderzhangsan 232 天前
能说下 mysql 版本吗?版本不同,可能导致优化的结果也是不同的。
|
9
I2E OP @coderzhangsan 8.0.25
|