我必须在一个超过1000万行的表上运行查询。 表结构是
user(varchar 100),
played(int 11),
won(int 11),
lost(int 11),
drawn(int 11),
user1(varchar 30),
user2(varchar 30).
Where
User - primary key
user1 - index
user2 - index
MySql数据库引擎是MyISAM。
我的问题是 - 当我运行以下查询时,它需要超过17秒。
SELECT * FROM h2hstats
WHERE (won+lost+drawn) > 5
AND (user1 = '717054941' OR user2 = '717054941')
如何减少执行时间?
我是否会对(赢了+丢失+绘制)列进行另一次索引?
答案 0 :(得分:2)
首先,如果用户列是数字,则不要对常量使用单引号。这可能会使优化器混淆。这可能不会帮助您查询(我的SQL在使用OR
的索引方面表现不佳),但值得尝试。
接下来,考虑将查询重写为:
SELECT *
FROM h2hstats
WHERE (won + lost + drawn) > 5 AND user1 = 717054941
UNION ALL
SELECT *
FROM h2hstats
WHERE (won + lost + drawn) > 5 AND user2 = 717054941 ;
MySQL肯定会为每个子查询使用索引。这应该会提升性能。
(注意:此版本假定user1
<> user2
。如果可以,您可能希望使用UNION
而不是UNION ALL
。)< / p>