簡體   English   中英

優化MySQL自聯接查詢

[英]Optimizing MySQL self-join query

我有以下查詢:

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。

您對為什么此查詢需要這么長時間有任何想法嗎? 我該如何優化?

TABLE SCAN正在對表操作的每個記錄進行操作。

根據本教程: 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

試試這個(如果您還沒有這樣做的話)...下面的命令應該在連接字段和一些條件上創建索引

CREATE INDEX _actions_ip ON actions( ip );
CREATE INDEX _actions_actor ON actions( actor );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM