簡體   English   中英

為什么我的MySQL查詢這么慢?

[英]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.

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