这是我目前正在执行的查询:
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
答案 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 = 2
和action < 16
可能会有所帮助。
您可能需要在WHERE
语句中引用的其他列上的索引,也可能需要data_id
上的索引。就像@AJ所说的那样,发布EXPLAIN
的输出,可以确定为什么它很慢。
答案 4 :(得分:0)
我会尝试复合索引:(actionid,worldid)。