[英]Why is my MySQL query is so slow?
我試圖找出為什么這個查詢如此緩慢(大約需要6秒才能得到結果)
SELECT DISTINCT
c.id
FROM
z1
INNER JOIN
c ON (z1.id = c.id)
INNER JOIN
i ON (c.member_id = i.member_id)
WHERE
c.id NOT IN (... big list of ids which should be excluded)
這是執行計划
+----+-------------+-------+--------+-------------------+---------+---------+--------------------+--------+----------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+--------+-------------------+---------+---------+--------------------+--------+----------+--------------------------+
| 1 | SIMPLE | z1 | index | PRIMARY | PRIMARY | 4 | NULL | 318563 | 99.85 | Using where; Using index; Using temporary |
| 1 | SIMPLE | c | eq_ref | PRIMARY,member_id | PRIMARY | 4 | z1.id | 1 | 100.00 | |
| 1 | SIMPLE | i | eq_ref | PRIMARY | PRIMARY | 4 | c.member_id | 1 | 100.00 | Using index |
+----+-------------+-------+--------+-------------------+---------+---------+--------------------+--------+----------+--------------------------+
是因為mysql必須拿出幾乎整個第一張桌子? 可以調整嗎?
您可以嘗試用子查詢替換c。
SELECT DISTINCT
c.id
FROM
z1
INNER JOIN
(select c.id
from c
WHERE
c.id NOT IN (... big list of ids which should be excluded)) c ON (z1.id = c.id)
INNER JOIN
i ON (c.member_id = i.member_id)
只留下必要的身份證
從您提供的信息中說,是否有更快的解決方案來獲取相同的數據是不可能的(我們需要知道數據分布以及必須使用哪些外鍵)。 但是假設這是一個分層數據集,那么該計划可能不是最優的:減少行數的唯一謂詞是c.id NOT IN....
優化任何查詢時要問自己的第一個問題是我是否需要所有行? 這回來了多少行?
我很難在查詢中查看任何返回“id”值列表(表示一組自動增量整數)的信息。
你不能使用NOT IN(或<>)的索引,因此最有效的解決方案可能是從'c'開始全表掃描 - 這應該是StanislavL查詢的結果。
由於您不使用i和z中的值,因此可以使用“exists”替換連接,這可能有助於提高性能。
我會考慮為c(id, member_id)
創建一個復合索引。 這樣查詢應該只在索引級別工作,而不掃描表中的任何行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.