假设我在MySQL中有一个如下所示的表:

CREATE TABLE mytable (
    column_A [...],
    column_B [...],
    column_C [...],
    column_X INT(11) UNSIGNED DEFAULT 0, -- type not really relevant
    INDEX a_b_c (column_A, column_B, column_C),
    INDEX x (column_X)
);

基本上,它在A、B、C列上有一个索引,在X列上有一个索引.

现在假设我想要执行一个查询,如下所示:

SELECT * FROM mytable
WHERE column_A = <something> AND column_B = <something> AND column_C = <SOMETHING>
ORDER BY column_X

上面的索引是否足以使其尽可能高效,或者在所有四列上也有一个索引会对它有好处吗?

推荐答案

假设这3个测试使用=,那么这将避免进行排序:

INDEX(A,B,C,X)

(并认为INDEX(A,B,C)是多余的.)

MySQL基本上从不在一个SELECT中使用两个不同的索引.无论如何,INDEX(x)在这种情况下是毫无用处的.

有一种方法可以发现我所说的一些话:

  1. 对你所拥有的东西跑EXPLAIN SELECT分.
  2. 添加我的4列索引,然后重新运行EXPLAIN.
  3. 丢弃3列指数并重新运行EXPLAIN.
  • "key_len"表示前WHERE列使用了多少列索引.
  • "Using FileSort"表示索引是not用于ORDER BY.(名称具有误导性--排序实际上可能使用磁盘文件;它可以在RAM中完成.)

更多关于索引的信息:Index Cookbook

Mysql相关问答推荐

无法从容器从APS. NET应用程序连接到MySQL服务器容器

MySQL INSERT INSERT ON DIPLICATE KEY UPDATE WITH COMPAY PRIMARY KEY失败

在MySQL CLI中,是否有自动完成过程的方法?

最终的自联表是如何记住关联的呢?

WordPress的sql命令从帖子中删除随机文本

使用 presto 或 mysql 添加每个组中的缺失值

将上传文件的存储路径放在一张表中的缺点是什么?

MySQL,递归 CTE.它如何以这种句法形式工作?

MySQL Procedure 变量在 count(*) 上接收 null

将 Go var 传递给 MySQL - try 在 Go lang 程序 (MySQL db) 中执行 db.Exec 时出错

如何将结果列中的不同值按其他列sql中的值带入单行

MySql查询无结果

此插页中的X是什么> X'3C2F756C3E'

如何使用 laravel 连接 mysql?

Laravel $q->where() 日期之间

MySQL 5.6 DATETIME 不接受毫秒/微秒

MySQL - 如何 Select 值在数组中的行?

MySQL 连接运算符

在 MySQL 中签名或未签名

电话号码和地址的mysql数据类型