问题描述
|
这是我当前正在执行的查询:
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 datalog ALL NULL NULL NULL NULL NULL 13510263使用where;使用文件排序
解决方法
尝试将索引添加到x,y和z。
您说您认为这行不通,因为它们可能包含很大范围的值。
只要您使用支持
BTREE
索引的表类型(这是MyISAM和INNODB支持的唯一索引类型),就不应该如此。如果使用的是“ 2”索引,则可能是这种情况,因为它需要索引每个值。但是,有了一个“ 1”索引,MySQL就能快速地为索引中的特定值排序。这就是为什么它还可以在具有比较运算符的查询(<
,>
等)上使用BTREE
索引的原因
您可以在这里看到更多信息:http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html
, 您可以尝试用AND action < 16
替换操作字段上的条件吗?
, 不知道这是否可行,但是您是否尝试过重新排序条件? x = -184.0可能比(...)中的操作要快。如果MySQL使用短路,则可以加快速度。
, 除了@patapizza所说的内容外,如果您基本上需要寻找随机的东西,则仅应使用IN():world_id = 2
和action < 16
可能会有所帮助。
您可能需要在WHERE
语句中引用的其他列上以及在data_id
上也需要索引。就像@AJ所说的那样,发布EXPLAIN
的输出,就可以确定为什么它很慢。
, 我会尝试一个复合索引:(actionid,worldid)。