mysql - 如何在不创建索引的情况下检索 MySQL 中的列选择性元数据?

标签 mysql sql indexing sqlperformance

假设以下 SQL 查询:

SELECT col1,col2 from table where col1 > 5 and col2 > 8

我相信 MySQL 将无法使用相同的表索引在两个列中查找,因为这两个条件都是范围条件。 因此,我试图了解在这种情况下找出要索引哪一列的最佳方法是什么(这可能是最有选择性的)。

MySQL 元数据的访问方式是否允许人们识别 A 列或 B 列是否更具选择性,而无需实际为这两个选项创建索引并查看基数信息?

编辑:澄清一下,目标是找到一种方法来做到这一点,即使对于在没有索引的情况下永远运行的查询(因此在这种情况下计算行数是不可能的)。

最佳答案

请注意,您的查询中只有 col1col2。这意味着 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

现在用另一个索引重复。

然后比较处理程序值。最大的数字将指示被触摸的索引(或数据)行数。

更简单的答案

如果查询中只有列是col1col2,那么添加INDEX(col1, col2)(按任意顺序)。

如果涉及更多列,请添加INDEX(col1)INDEX(col2)。优化器在它们之间进行选择。

关于mysql - 如何在不创建索引的情况下检索 MySQL 中的列选择性元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47378112/

相关文章:

MySQL 更新其他表中的多行多个值,给出重复值

php - $result 的 Codeigniter num_rows() 始终返回 0

SQL SUM、CASE 和 DISTINCT

mysql - 将包含日期的 Varchar 转换为 DATETIME

mysql - 如果在查询中使用 order by,如何对 MySQL 中的索引列进行排序?

php - MySQL JOIN 一个表或另一个表

mysql - 加载本地 infile 不允许 perl mysql

sql - SQL 2012 中的条件 where 子句

java - 在返回语句和平均问题中找不到符号

php - PHP 整数数组索引真的是数字吗?