performance - Maria DB INDEX selection - 为什么 maria 选择次优索引?
问题描述
我有一个很大的表(数百万行),在 MariaDB(InnoDB,5.5.48-MariaDB-1~precise-wsrep)上运行,假设我的表结构如下
[
ID,
Field A,
Field B,
Field C,
Field D
]
我在这张表上有 3 个索引:
- PRIMARY[ID]
- INDEX 1 -> [A,B,C]
- INDEX 2 -> [A, D]
我要优化的查询如下
SELECT * FROM table
WHERE (a = val1) AND (B NOT IN ([val2, val3])) AND (C BETWEEN val4 AND val5)
ORDER BY ID ASC LIMIT 50 OFFSET 100
这个查询应该自然适合我的 INDEX 1 对吧?但 Maria 更喜欢使用 PRIMARY INDEX,这基本上意味着全表扫描(导致 40 秒的查询......)。
当我从这个查询中删除 ORDER 或 LIMIT(或两者)时,Maria DB 能够选择明显优于 PRIMARY 的 INDEX 2。
问题 1 -> 当 ORDER BY 和 LIMIT 结合使用时,为什么 Maria 会回退到 PRIMARY INDEX ?
我决定通过禁止使用 PRIMARY 来稍微调整我的查询。
SELECT * FROM table IGNORE INDEX(`PRIMARY`)
WHERE (a = val1) AND (B NOT IN ([val2, val3])) AND (C BETWEEN val4 AND val5)
ORDER BY ID ASC LIMIT 50 OFFSET 100
结果 -> 对我的第一次优化感到非常高兴,这个 40 秒的查询现在需要 1 秒,但仍然......
问题 2 -> 为什么 MariaDB 选择 INDEX 2 ?
当我强制 Maria 使用 INDEX 1 时,查询延迟到 100 毫秒(快 10 倍),因此,我还不完全满意......
感谢您的帮助人们:)
解决方案
它是B NOT IN (val2, vl3)
不能使用索引的部分,或者没有你想象的那么有效。我建议您创建此索引:
(A, C, B)
推荐阅读
- cloud - 将部分数据从 IBM 云传输到 Microsoft Azure
- reactjs - 在可观察的盒装原始值上绑定组件
- jsf - JSF HTTP 状态 404 - 在 Hello world 程序中未找到
- spring-cloud-dataflow - SCDF V1.6.0-RELEASE 在 PCF 上部署时不断崩溃
- python - 使用构造包在 python 中的 BitStruct 中定义 BitStruct
- spring - 将 @ConfigurationProperties 绑定到用于创建 bean 的构建器
- java - 如何根据不同的if条件在android firestore中实现多订单?
- ajax - Angular 6:http 获取响应
- javascript - 监视 componentDidMount 中的方法调用
- html - ::webkit 滚动条产生不同大小的滚动条