我正在执行以下查询
SELECT COUNT(*)
FROM table
WHERE field1='value' AND (field2 >= 1000 OR field3 >= 2000)
字段 1 上有一个索引,字段 2 和字段 3 上有另一个索引。
我看到 MySQL 总是选择 field1 索引,然后使用其他两个字段进行连接,这非常糟糕,因为它需要连接 146.000 行。
关于如何改进的建议?谢谢
(尝试提出的解决方案后进行编辑)
基于提出的解决方案,我在玩这个时在 Mysql 上看到了这个。
SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
UNION SELECT * FROM table WHERE columnB = value2) AS unionTable;
比执行慢很多:
SELECT COUNT(*)
FROM table
WHERE (columnA = value1 AND columnB = value2)
OR (columnA = value1 AND columnC = value3)
有两个复合索引:
index1 (columnA,columnB)
index2 (columnA,columnC)
有趣的是,要求 Mysql“解释”它在两种情况下总是使用 index1 的查询,并且不使用 index2。
如果我将索引更改为:
index1 (columnB,columnA)
index2 (columnC,columnA)
和查询:
SELECT COUNT(*)
FROM table
WHERE (columnB = value2 AND columnA = value1)
OR (columnC = value3 AND columnA = value1)
然后这是我发现 Mysql 工作的最快方式。