在 MySQL 查询中使用 OR 时,有没有办法使用索引来避免文件排序?

Posted

技术标签:

【中文标题】在 MySQL 查询中使用 OR 时,有没有办法使用索引来避免文件排序?【英文标题】:Is there a way to use the index to avoid a filesort when OR is used in MySQL query? 【发布时间】:2011-01-10 22:55:54 【问题描述】:

我有以下查询和以下 2 个索引,但我仍然得到一个文件排序。有没有办法进一步优化这一点,以便我避免文件排序,还是我只需要忍受它?

查询:

SELECT * FROM table WHERE row1 > '0' OR row2 = '1' ORDER BY id DESC

索引:

第1行

row2,id

解释输出:

使用 sort_union(row1,row2_id); 使用哪里;使用文件排序

【问题讨论】:

row1 和 row2 列是什么数据类型 【参考方案1】:

ORDER BY ROW2,ID 或在 ID 上添加索引。

【讨论】:

id上有索引,是主键。【参考方案2】:

是的,你可以。只需添加 (id, row1, row2) 之类的索引。

这个索引会起作用,因为其中的行会被预先排序,mysql 只需要选择令人满意的行。

此外,sort_union() 索引合并对 mySQL 来说并不是很好的优化。

【讨论】:

【参考方案3】:

回答有点晚了,但我想说的是,使用“或”可能会导致该问题。您可以尝试对两个不同的查询使用联合。

【讨论】:

他按id 对结果集进行排序,但id 上没有索引(或者id 是第一列的复合索引)。恕我直言,这更有可能是文件排序的原因。 可能是像“row1,row2,id”这样的组合索引可以完成这项工作。 可能是其他一些索引,是的。我更多地考虑将row1 上的索引更改为row1, id 上的一个或在id 上添加一个单独的索引,但我并不是真正的索引专家。虽然这似乎是一个简单的案例,但我必须在做出判断之前进行测试和比较。

以上是关于在 MySQL 查询中使用 OR 时,有没有办法使用索引来避免文件排序?的主要内容,如果未能解决你的问题,请参考以下文章

使 javascript 字符串 sql 友好

有没有办法在 Quartz Scheduler 中拆分读/写查询以使用 mysql 主从复制?

有没有办法在单个 mysql 查询中搜索所有字段? [复制]

有没有办法在单个 mysql 查询中搜索所有字段? [复制]

MySQL - 强制不使用缓存来测试查询速度

Mysql5.7中子查询时order by与group by合用无效的解决办法