索引多列

时间:2016-07-29 09:06:00

标签: php mysql sql

我必须在一个超过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')

如何减少执行时间?

我是否会对(赢了+丢失+绘制)列进行另一次索引?

1 个答案:

答案 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&lt;&gt; user2。如果可以,您可能希望使用UNION而不是UNION ALL。)< / p>