MySQL简单但查询速度慢(索引错误?)

MySQL简单但查询速度慢(索引错误?),mysql,indexing,Mysql,Indexing,我正在处理一个简单的查询,它在一个由126000条记录填充的myisam表中运行大约1.2秒: SELECT * FROM my_table WHERE primary_key != 5 AND ( col1 = 528 OR (col2 = 265 AND col3 = 1) ) ORDER BY primary_key DESC 我已经为where子句中使用的每个字段创建了单个索引,但只有主_键(我的_表的自动增量字段)用作键,而col1和col2被忽略,查询速度会慢得多。我应该如

我正在处理一个简单的查询,它在一个由126000条记录填充的myisam表中运行大约1.2秒:

SELECT * FROM my_table
WHERE primary_key != 5 AND
(
    col1 = 528 OR (col2 = 265 AND col3 = 1)
)
ORDER BY primary_key DESC

我已经为where子句中使用的每个字段创建了单个索引,但只有主_键(我的_表的自动增量字段)用作键,而col1和col2被忽略,查询速度会慢得多。我应该如何创建索引(可能是多个索引)或编辑查询?

用于了解发生了什么。这将确定正在使用哪些索引,从而使您能够优化查询。

使用以了解发生了什么。这将确定正在使用哪些索引,从而使您能够优化查询。

不幸的是,如果不彻底了解MySQL内部结构,几乎无法预测哪些索引会比其他索引工作得更好。但是,对于每个查询(或者,至少是子查询/连接),MySQL将只使用1个索引,您已经声明正在使用主键,因此我假设您已经查看了解释输出


您可能希望以不同的顺序对所有(primary_key,col1,col2,col3)或其中的一个子集尝试多列索引,以找到最佳结果。最好的索引将主要取决于列的基数,因此,甚至可能随着时间的推移而变化,具体取决于表中的数据。

不幸的是,如果不彻底了解MySQL内部结构,几乎无法预测哪些索引会比其他索引工作得更好。但是,对于每个查询(或者,至少是子查询/连接),MySQL将只使用1个索引,您已经声明正在使用主键,因此我假设您已经查看了解释输出


您可能希望以不同的顺序对所有(primary_key,col1,col2,col3)或其中的一个子集尝试多列索引,以找到最佳结果。最佳索引将主要取决于列的基数,因此,甚至可能随着时间的推移而变化,具体取决于表中的数据。

如果您有以下多列“覆盖”索引,您将获得最佳性能:

并发出以下查询:

(SELECT * FROM my_table
WHERE primary_key != 5 AND
  col1 = 528)
UNION
(SELECT * FROM my_table
WHERE primary_key != 5 AND
 col2 = 265 AND col3 = 1)
ORDER BY primary_key DESC
通过基于基数更改索引中字段的顺序,可以获得可变的、更好的性能

在原始查询中,WHERE子句中的整个选择不能使用索引,这导致了部分表扫描

在上面的查询中,第一个子查询能够完全利用第一个索引,避免任何表扫描,第二个子查询使用第二个索引


不幸的是,MySQL无法利用索引对完整结果集上的记录进行排序,可能会使用filesort对它们进行排序。因此,如果您不需要按主键排序的记录,请删除外部的
ORDER
子句以获得更好的性能,尽管如果结果集很小,这两种方式都不应该成为问题。

如果您有以下多列“覆盖”索引,您将获得最佳性能:

并发出以下查询:

(SELECT * FROM my_table
WHERE primary_key != 5 AND
  col1 = 528)
UNION
(SELECT * FROM my_table
WHERE primary_key != 5 AND
 col2 = 265 AND col3 = 1)
ORDER BY primary_key DESC
通过基于基数更改索引中字段的顺序,可以获得可变的、更好的性能

在原始查询中,WHERE子句中的整个选择不能使用索引,这导致了部分表扫描

在上面的查询中,第一个子查询能够完全利用第一个索引,避免任何表扫描,第二个子查询使用第二个索引


不幸的是,MySQL无法利用索引对完整结果集上的记录进行排序,可能会使用filesort对它们进行排序。因此,如果您不需要按主键排序的记录,请删除outer
ORDER
子句以获得更好的性能,尽管如果结果集很小,这两种方式都不应该成为问题。

索引必须与查询方向(DESC)相同。索引必须与查询方向(DESC)相同。