需要有关加快MySQL查询速度的建议

时间:2011-06-13 16:32:14

标签: mysql sql database

这是我目前正在执行的查询:

SELECT * FROM `datalog`
WHERE world_id IN (2) 
AND action IN (0,1,2,8,9,10,11,13,14,15)
AND x = -184.0 AND y = 98.0 AND z = 141.0
ORDER BY data_id DESC;

不幸的是,它需要很长时间而且不知道为什么(数据库中有1400万条目的5秒或更长时间)。我有一个关于world_id和action的索引(因为最多只有7个世界和20个动作)。我怎么能加快搜索速度呢?

编辑 - 解释的值:SIMPLE数据记录ALL NULL NULL NULL NULL 13510263使用where;使用filesort

5 个答案:

答案 0 :(得分:1)

尝试将索引添加到x,y和z。

你说过你认为这不起作用,因为它们可以包含很多值。

只要您使用支持BTREE索引的表类型(这是MyISAM和INNODB支持的唯一索引类型),就不应该这样。如果您使用HASH索引,可能就是这种情况,因为它需要索引每个值。但是使用BTREE索引,MySQL能够快速对索引中的特定值进行排序。这就是为什么它能够对带有比较运算符的查询使用BTREE索引(<>等。)

您可以在此处查看更多内容:http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html

答案 1 :(得分:0)

您可以尝试按AND action < 16替换行动字段中的条件吗?

答案 2 :(得分:0)

不知道这是否有效,但您是否尝试重新排序条件? x = -184.0可能比(...)中的动作更快。如果MySQL使用短路,这可能会加快速度。

答案 3 :(得分:0)

除了@patapizza所说的,你应该只使用IN(),如果你基本上有随机的东西要寻找,那么:world_id = 2action < 16可能会有所帮助。

您可能需要在WHERE语句中引用的其他列上的索引,也可能需要data_id上的索引。就像@AJ所说的那样,发布EXPLAIN的输出,可以确定为什么它很慢。

答案 4 :(得分:0)

我会尝试复合索引:(actionid,worldid)。