外键上的mariadb非选择性索引

时间:2018-05-01 19:59:31

标签: mysql sql query-optimization mariadb query-performance

我正在对mariaDB上一个非常慢的索引进行故障排除。这需要10秒以上。 该表有超过10M行。 where子句有'where a = x和b = y'。 列b具有选择性索引。 列a具有非选择性索引(仅5个不同的值),但由于a是外键,因此无法删除。 mariaDB正在使用2个索引的交叉,这使得它比单独使用b上的索引更糟糕。 我不知道如何解决这个问题:

  • 我无法删除索引,因为我想确保完整性
  • 我不想取消整个数据库的交叉索引优化
  • 我不想使用索引提示,因为它不是标准的(即使我不确定我有什么其他选项)。

有什么想法吗?

1 个答案:

答案 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将自动选择新索引,因为它比使用以前的索引更快。