假设以下 SQL 查询:
SELECT col1,col2 from table where col1 > 5 and col2 > 8
我相信 MySQL 将无法使用相同的表索引在两个列中查找,因为这两个条件都是范围条件。 因此,我试图了解在这种情况下找出要索引哪一列的最佳方法是什么(这可能是最有选择性的)。
MySQL 元数据的访问方式是否允许人们识别 A 列或 B 列是否更具选择性,而无需实际为这两个选项创建索引并查看基数信息?
编辑:澄清一下,目标是找到一种方法来做到这一点,即使对于在没有索引的情况下永远运行的查询(因此在这种情况下计算行数是不可能的)。
最佳答案
请注意,您的查询中只有 col1
和col2
。这意味着 INDEX(col1,col2)
和 INDEX(col2,col1)
是“覆盖”。 “覆盖提供了额外的提升,因为整个查询可以在索引的 BTree 中执行。
如果您将另一列添加到 SELECT
列表中,它将不再被覆盖。
但问题是关于将列放入索引中的哪个顺序。
将其视为事物的二维数组。 col1 > 5 and col2 > 8
指的是该二维数组的右下角。 MySQL 基本上必须扫描数组的右“一半”或下“一半”,因为一维索引首先按行或列排序。
优化的"new"“MRR”功能可能能够将精力集中在角落而不是一半。这是找出答案的方法:
add one index
FLUSH STATUS;
SELECT ...
SELECT SESSION STATUS LIKE 'Handler%';
drop that index
现在用另一个索引重复。
然后比较处理程序值。最大的数字将指示被触摸的索引(或数据)行数。
更简单的答案
如果查询中只有列是col1
和col2
,那么添加INDEX(col1, col2)
(按任意顺序)。
如果涉及更多列,请添加INDEX(col1)
和INDEX(col2)
。优化器在它们之间进行选择。
关于mysql - 如何在不创建索引的情况下检索 MySQL 中的列选择性元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47378112/