2012-07-24 67 views
0

我有这样的查询:MySQL的 - 在其列使用索引

SELECT 
    `Games`.`id`, `Games`.`name`, `Games`.`url` 
FROM 
    `Games` 
LEFT JOIN 
    `GamesRuns` 
ON 
    Games.id = GamesRuns.game_id 
WHERE 
    (GamesRuns.date >= '2012-07-17 13:14:08') AND (Games.score = 0) AND (Games.active = 1) AND (Games.display = 1) 
GROUP BY 
    `Games`.`id` 
ORDER BY 
    SUM(GamesRuns.count) DESC 
LIMIT 5; 

我要问哪个列,我应该把索引。我认为它应该在GamesRuns.date和Games.score + Games.active + Games.display作为multiindex。我认为把一个索引放在GamesRuns.count中是毫无意义的,因为它在SUM函数中,否则(没有SUM函数)应该有一个索引。这样对吗?因为当我使用EXPLAIN时,它向我展示了possible_key,而且键是PRIMARY,但PRIMARY只是Games.id。谢谢您的回答。

+0

帮不了你,除非你发布一些示例数据,你的表结构的其余部分。此外,您应该运行EXPLAIN SELECT [...]以了解更多信息。 – 2012-07-24 14:15:25

+0

开始阅读 - http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – ManseUK 2012-07-24 14:15:48

回答

0

通常你会想要一个关于任何用于连接的东西的索引,以及如果可能的话在任何地方使用的东西。

据我所知MySql不支持函数索引(我实际上并没有使用它),因此您不能在SUM函数上放置索引。有人会纠正我,如果我错了我敢肯定

所以对于你的例子,我会把一个索引放在Games.id,GamesRuns.game_id,GamesRuns.date,Games.score,Games.active,Games。显示

0

因为你使用的是场内的games.id,而且还在组内,这个场应该是好的。

此外,该领域gamesruns.game_id。

日期,分数和活跃和显示也是候选人。但在这种情况下,你应该注意你有多少记录。其余的由您决定,并取决于对数据的深入研究。

所有最好的

+0

我可以依靠MySQL总是使用最好的索引吗?例如使用Games.id(PRIMARY)而不是Games.active和Games.score和Games.display? – thorewi 2012-07-24 15:13:03

+0

一般来说优化器并不是那么糟糕。我有任何怀疑“解释”这个陈述 – devanand 2012-07-25 13:26:59