首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化MySQL自连接查询

优化MySQL自连接查询
EN

Stack Overflow用户
提问于 2014-04-14 21:45:16
回答 2查看 49关注 0票数 0

我有以下疑问:

代码语言:javascript
复制
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

以下是查询的解释:

代码语言:javascript
复制
+----+-------------+-------+-------+------------------+---------+---------+------------------+------+--------------------------+
| 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。

你知道为什么这个查询花了这么长时间吗?如何对其进行优化?

EN

回答 2

Stack Overflow用户

发布于 2014-04-14 22:09:54

表扫描是在表操作的每条记录中进行的。

根据本教程:http://www.mysqltutorial.org/mysql-self-join/

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2014-04-14 22:08:07

试试这个(如果你还没有这样做的话) ...下面的命令应该在连接字段和一些where条件上创建索引

代码语言:javascript
复制
CREATE INDEX _actions_ip ON actions( ip );
CREATE INDEX _actions_actor ON actions( actor );
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23061804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档