我有点羞于问这个问题,因为我已经使用MySQL多年了,但是哦,好吧.

我有一张表,有两个字段,ab.我将对其运行以下查询:

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

从性能的Angular 来看,is at least one of the following configurations of indexes slower for at least one query?如果是,请详细说明.

  1. ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b);
  2. ALTER TABLE ... ADD INDEX (a, b);
  3. ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b); ALTER TABLE ... ADD INDEX (a, b);

谢谢(请注意,我们谈论的是非唯一索引)

推荐答案

是的,至少有一个病例要慢得多.如果只定义以下索引:

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

...则查询SELECT * FROM ... WHERE B = 1;将不使用该索引.

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

Database相关问答推荐

在多组MongoDB中查找最新文档的有效方法

使用mongoose 在嵌套对象中查找特定字段

如何使用 Gramex FormHandler 动态(在运行时)创建或更改数据库模式

在sql server中拆分字符串

将光标中找到的值输出到logcat?

将 .frm 和 .opt 文件导入 MySQL

NoSql DB 和 OO Db 有什么区别?

我可以为 dapper-dot-net 映射指定数据库列名称吗?

NameError:设置更改为 mysql 后未定义名称_mysql

如何使用 INSERT ... ON CONFLICT ... 更新所有列?

是否有一个 postgres 命令来列出/删除所有materialized视图?

在 Rails 中销毁/删除数据库

如果数据库已经提供缓存,为什么还要使用应用程序级缓存?

在 SQL Server 2008 中区分两个表架构的最简单方法是什么?

限制 SQL JOIN

如何在实体框架中使用字符串属性作为主键

显式事务回滚是否必要?

Web 应用程序的文件存储:文件系统、数据库和 NoSQL 引擎

我应该标准化我的数据库吗?

列的 SQL Server 2008 千位分隔符