sql - 多个和单个索引

标签 sql mysql database indexing

自从我使用 MySQL 多年以来,我有点不好意思问这个问题,但是哦。

我有一个包含两个字段的表,ab。我将对其运行以下查询:

  • SELECT * FROM ... WHERE A = 1;
  • SELECT * FROM ... WHERE B = 1;
  • SELECT * FROM ... WHERE A = 1 AND B = 1;

从性能的角度来看,以下索引配置中的至少一种是否对至少一个查询较慢?如果是,请详细说明。

  1. ALTER TABLE ... 添加索引 (a); ALTER TABLE ...添加索引(b);
  2. ALTER TABLE ... ADD INDEX (a, b);
  3. ALTER TABLE ... 添加索引 (a); ALTER TABLE ...添加索引(b); ALTER TABLE ...添加索引(a,b);

谢谢(注意我们说的是非唯一索引)

最佳答案

是的,至少有一种情况要慢得多。如果只定义以下索引:

ALTER TABLE ... ADD INDEX (a, b);

... 那么查询 SELECT * FROM ... WHERE B = 1; 将不会使用该索引。

当您使用复合键创建索引时,键的列顺序很重要。建议尝试对 key 中的列进行排序以增强选择性,将最具选择性的列放在 key 的最左侧。如果您不这样做,并将非选择性列作为键的第一部分,则可能根本不使用索引。 (来源:Tips on Optimizing SQL Server Composite Index)

关于sql - 多个和单个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2155656/

相关文章:

mysql - 查询查询 - 第一次

sql - XML 解析 : well formed check: undeclared entity

sql - 为什么在左连接中使用子查询会给出与等效表完全不同的答案?

mysql - 编译与 MySql 数据库交互的 C 程序时出现问题

database - "domain"和 "persistence"是什么意思?

sql - 使用 sqlite 按行平均

mysql - 有没有开源的MySQL性能监控软件?

mysql - 在此查询中获取数据计数的更好方法?

mysql - 如何在 MySQL 中当月的第一天和当天之间进行选择?

java - 当 JPA 实体不应准确反射(reflect)数据库上的物理模型时