mysql - mysql 中的索引列

标签 mysql sql database indexing

我有一个 mysql_query 。我想知道要索引哪一个。

SELECT count(*) FROM foo WHERE c=5 GROUP BY d

也许是 (c,d) 或者只是 c?

我还有一个类似的。

SELECT count(*) FROM foo WHERE d=6 GROUP BY b

也许 (d,b) 或者只是 d?

这里还有一个:

SELECT a FROM foo WHERE b=5 GROUP BY c

这里(a,b,c)?

我的观点只是建立一个涵盖三个查询的索引。这里最好的一个是?在哪一栏?

最佳答案

不可能用一个索引来涵盖所有用例。

MySQL 可以受益于在 order by/group by 列上建立索引。避免执行文件排序和临时表操作。我的建议是:

1) (c,d)

2) (d,b)

3) 对于最后一个 (a,b,c) 将不可用,因为它以 a 开头(列顺序很重要)。正确的索引是 (b,c,a)。

一点解释:

MySQL 执行以下操作:

  1. 过滤结果(需要b)
  2. 如果有按列排序的索引,则按顺序获取它或对其进行排序(需要c)(分组依据相同)
  3. 返回选择部分中的列(需要一个)

另一件非常重要的事情是索引的选择性。例如,如果您有一个 50% true、50% false 的 bool 值,MySQL 将不会使用该索引,因为扫描整个表比遍历索引树更容易。

关于mysql - mysql 中的索引列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21779839/

相关文章:

php - 我正在尝试从数据库中提取数据,其中数据将从数据库中的两个不同表中提取,错误位于 $returns = mysql_query

sql - 根据日期比较多个SQL表数据

mysql - 使用shell脚本在mysql中插入数据

mysql - 优化 SELECT COUNT(DISTINCT(col)) var, col2 var2 FROM table WHERE col< >'X' and col2 between 'Y' and 'Z' GROUP BY var2 ORDER BY var DESC;为了速度?

MySQL Won't Source, then won't connect

sql - 取非集合表达式中满足的第一行的值

mysql - 如何在mac上比较两个mysql数据库?

mysql - SQL:获取一个表的计数并加入其他表

python - 关于如何在创建表后在 sqlalchemy 中添加基本索引的困惑

mysql - 查找连续值的范围