【发布时间】:2018-10-11 21:02:54
【问题描述】:
我正在对 mariaDB 上一个非常慢的索引进行故障排除。它需要 10 多秒。 该表有超过 10M 行。 where 子句有'where a=x and b=y'。 b 列具有选择性索引。 列 a 具有非选择性索引(只有 5 个不同的值),但它不能被删除,因为 a 是外键。 mariaDB 使用了两个索引的交集,这使得它的性能比单独使用 b 上的索引差很多。 我不知道如何解决这个问题:
- 我无法删除 a 上的索引,因为我想确保完整性
- 我不想取消整个数据库的相交索引优化
- 我不想使用索引提示,因为它不是标准的(即使我不确定我还有什么其他选项)。
有什么想法吗?
【问题讨论】:
-
我们需要相关表格的
SHOW CREATE TABLE的输出。也许您的计算机着火了并且 CPU 受到了限制,或者它正在使用 5400 RPM 驱动器,我们不知道这里会发生什么。 “它很慢”是一种观察结果,而不是我们可以使用的诊断方法。 -
感谢 tadman,我在下面添加了一些输出。然而问题是一般性的:一个外键自动添加一个索引,这个索引可以是非选择性的(这通常是父表的情况),然后优化器使用 intersect 如果索引之一是非选择性的,这会损害性能。
-
值得编辑问题并以正确的格式添加该内容。它在 cmets 中表现不佳。
-
您是否已经在表上尝试过复合索引?
标签: mysql sql query-optimization mariadb query-performance