我正在对mariaDB上一个非常慢的索引进行故障排除。这需要10秒以上。 该表有超过10M行。 where子句有'where a = x和b = y'。 列b具有选择性索引。 列a具有非选择性索引(仅5个不同的值),但由于a是外键,因此无法删除。 mariaDB正在使用2个索引的交叉,这使得它比单独使用b上的索引更糟糕。 我不知道如何解决这个问题:
有什么想法吗?
答案 0 :(得分:0)
foreing键会自动添加索引...
嗯......在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正在使用2个索引的交叉,这使得它的表现更差......
请注意,组合第三个索引(包含两列)可避免索引交集。 MariaDB将自动选择新索引,因为它比使用以前的索引更快。