我有以下疑问:
SELECT DISTINCT(a1.actor)
FROM actions a1
JOIN actions a2 ON a1.ip = a2.ip
WHERE a2.actor = 143
AND a2.ip != '0.0.0.0'
AND a2.ip != ''
AND a2.actor != a1.actor
AND a1.actor != 0以下是查询的解释:
+----+-------------+-------+-------+------------------+---------+---------+------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+------------------+---------+---------+------------------+------+--------------------------+
| 1 | SIMPLE | a2 | range | actor,ip,actorIp | actorIp | 66 | NULL | 3800 | Using where; Using index |
| 1 | SIMPLE | a1 | ref | ip | ip | 62 | formabilio.a2.ip | 11 | Using where |
+----+-------------+-------+-------+------------------+---------+---------+------------------+------+--------------------------+即使这看起来不是一个有问题的查询,但在我的机器中,使用MyIsam需要69秒,使用InnoDB需要56秒。这个表大约有1000条记录。正如您从解释中看到的,我在actor列、ip列甚至这两列上都有索引。我有mysql版本5.5.35。
你知道为什么这个查询花了这么长时间吗?如何对其进行优化?
发布于 2014-04-14 22:09:54
表扫描是在表操作的每条记录中进行的。
根据本教程:http://www.mysqltutorial.org/mysql-self-join/
SELECT DISTINCT(a1.actor)
FROM actions a1
INNER JOIN actions a2
ON a1.ip = a2.ip AND
a1.actor <> a2.actor
WHERE a2.actor = 143
AND a2.ip <> '0.0.0.0'
AND a2.ip <> ''
AND a1.actor <> 0发布于 2014-04-14 22:08:07
试试这个(如果你还没有这样做的话) ...下面的命令应该在连接字段和一些where条件上创建索引
CREATE INDEX _actions_ip ON actions( ip );
CREATE INDEX _actions_actor ON actions( actor );https://stackoverflow.com/questions/23061804
复制相似问题