我正在排除mariadb上一个非常慢的索引。它需要10秒以上。这张table有超过10万行。where子句有“where a=x and b=y”。b列有一个选择性索引。列a有一个非选择性索引(只有5个不同的值),但它不能被删除,因为a是外键。mariadb使用了两个索引的intersect,这使得它的性能比单独在b上使用索引差得多。我不知道如何解决这个问题,因为:
我无法删除上的索引,因为我要确保完整性
我不想取消整个数据库的intersect索引优化
我不想使用索引提示,因为它不是标准的(即使我不确定我还有什么其他选择)。
有什么想法吗?
1条答案
按热度按时间pxiryf3j1#
外键自动添加索引。。。
好。。。在mariadb,是的。无论如何,这不是一个标准特性;其他数据库(oracle、db2、postgresql等)不会自动创建索引来强制执行外键。
我不能完全理解你的问题,但在我看来,你有两个索引,一个使用列
a
另一个使用列b
. 还有。。。您正在尝试决定使用哪一个或如何组合它们。使用索引进行您提到的查询并不困难。如果where条件是
where a=x and b=y
,这是一个通过创建索引来大大加快速度的完美案例(b, a)
,例如:我用的笔记
(b, a)
而不是(a, b)
. 这样,最有选择性的列被放在第一位,查询运行哈希冲突和/或存储桶溢出的可能性较小。现在,关于你的观察:
mariadb正在使用两个索引的交集,这使得它的性能更差。。。
请注意,合并第三个索引(有两列)可以避免索引交叉。mariadb将自动选择新索引,因为它比使用以前的任何组合都快。