在 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 时,有没有办法使用索引来避免文件排序?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Quartz Scheduler 中拆分读/写查询以使用 mysql 主从复制?
有没有办法在单个 mysql 查询中搜索所有字段? [复制]