mariadb外键非选择性索引

d7v8vwbk  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(263)

我正在排除mariadb上一个非常慢的索引。它需要10秒以上。这张table有超过10万行。where子句有“where a=x and b=y”。b列有一个选择性索引。列a有一个非选择性索引(只有5个不同的值),但它不能被删除,因为a是外键。mariadb使用了两个索引的intersect,这使得它的性能比单独在b上使用索引差得多。我不知道如何解决这个问题,因为:
我无法删除上的索引,因为我要确保完整性
我不想取消整个数据库的intersect索引优化
我不想使用索引提示,因为它不是标准的(即使我不确定我还有什么其他选择)。
有什么想法吗?

pxiryf3j

pxiryf3j1#

外键自动添加索引。。。
好。。。在mariadb,是的。无论如何,这不是一个标准特性;其他数据库(oracle、db2、postgresql等)不会自动创建索引来强制执行外键。
我不能完全理解你的问题,但在我看来,你有两个索引,一个使用列 a 另一个使用列 b . 还有。。。您正在尝试决定使用哪一个或如何组合它们。
使用索引进行您提到的查询并不困难。如果where条件是 where a=x and b=y ,这是一个通过创建索引来大大加快速度的完美案例 (b, a) ,例如:

create index ux_mytable_b_a on my_table (b, a);

我用的笔记 (b, a) 而不是 (a, b) . 这样,最有选择性的列被放在第一位,查询运行哈希冲突和/或存储桶溢出的可能性较小。
现在,关于你的观察:
mariadb正在使用两个索引的交集,这使得它的性能更差。。。
请注意,合并第三个索引(有两列)可以避免索引交叉。mariadb将自动选择新索引,因为它比使用以前的任何组合都快。

相关问题