有个很简单的查询,唯一的问题是数据表较大,A 有千万级,B 有接近十亿
SELECT FIELDS FROM A
LEFT JOIN B ON A.a=B.b
WHERE A.w="" AND A.time>?
A 表在 time 上有索引,B 表在 b 上有索引
在我开发环境的 MySQL 中,explain 看上去一切正常
A range time
B ref idx_b
但是到了线上的 TIDB 中,就变成了
IndexRangeScan_101(Build) table:A ,index:idx_time(time)
TableFullScan_114 table:B keep order:false
主要的问题是,B 变成了全表扫描,完全无法接受。
如果像 MySQL 正常索引,A 表过滤后的数据量只有几千条。
改了 USE INDEX 以后,变成了索引全扫描?情况也没好到哪里去...
Analyze Table 的命令也执行过了,还是没变化
IndexRangeScan_101(Build) table:A ,index:idx_time(time)
IndexFullScan table:B, index:idx_b(b) keep order:false
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.