这个问题猜测是索引问题,查阅资料使用 force index 解决
# DEV_INFO 表数据量 5 千万级别,DEV_ID 唯一索引,C_TIME 普通索引
sql> SELECT DEV_INFO FROM DEVICE_INFO WHERE DEV_ID = "500000022" ORDER BY C_TIME DESC limit 1;
结果:太慢了 直接 timeout 了
sql> SELECT DEV_INFO FROM DEVICE_INFO FORCE INDEX(DEV_ID) WHERE DEV_ID = "500000022" ORDER BY C_TIME DESC limit 1;
结果:1 row retrieved starting from 1 in 106 ms (execution: 94 ms, fetching: 12 ms)
明明应该能查出 13 条数据,结果只有 12 条记录,我确定少的那个 ID 82985 数据库中存在
# (里面有 13 个 ID)
sql> select * from POINT where ID in (82925,82909,82905,82901,82929,82981,82979,82977,82975,82983,92985,83013,83005);
结果:12 rows retrieved starting from 1 in 87 ms (execution: 55 ms, fetching: 32 ms)
sql> select * from POINT WHERE ID=82985;
结果:1 row retrieved starting from 1 in 83 ms (execution: 58 ms, fetching: 25 ms)
我想到这些问题应该都是 MySQL 执行的问题
所以 我想系统的学习一下 sql 深一点的知识,有没有推荐的 教程或者书籍
啊 第二个问题,确实需要我配个眼镜
第一个,DEV_ID 不是唯一索引,我写错了,就是普通索引,所以会查出多条数据
1
sagaxu 2019-06-20 11:16:03 +08:00 via Android 1
你需要治疗近视眼
|
2
telami 2019-06-20 11:23:14 +08:00
第一个问题,搞不太懂都用 id 查了,为啥还要 order by limit 1,难道会查出来多条么
第二个问题,附议楼上。 |
3
lecoo 2019-06-20 11:26:43 +08:00
你 13 个 ID 里就没有 82985。
|
4
zhuangjia 2019-06-20 11:34:58 +08:00
82985 确实不在 13 个 ID 里面。附议上三楼
|
5
RubyJack 2019-06-20 11:38:25 +08:00
1L 笑尿了哈哈哈哈哈哈
|
6
dilu 2019-06-20 11:51:18 +08:00 via Android
不要强制使用索引,除非你已经 diao 到爆炸
|
7
akira 2019-06-20 12:11:19 +08:00
遇到性能问题,先上 explain,大部分性能问题都能通过这个确认
|
8
sagaxu 2019-06-20 13:23:27 +08:00 via Android
把 DEV_ID 索引去掉,建一个(DEV_ID, C_TIME DESC)联合索引
|