MySQL - WHERE IN вызывает 100% процессора и не дает результатов - PullRequest
2 голосов
/ 24 октября 2011

Этот запрос занимает доли секунды

select * from tbl1 limit 0,1

Этот запрос занимает секунду

SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2

Этот запрос потребляет 100% ресурсов процессора и занимает 190 секунд (выборка 0 с), чтобы вернутьрезультат

select * from tbl1 WHERE ID IN (SELECT Distinct(col2) FROM tbl2 WHERE col3 = 2) limit 0,1

Я пытаюсь выполнить этот запрос для полного набора данных (не ограничивая его только одной записью)

Что может быть причиной проблемы производительности, структуры моей таблицы?

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Подзапросы в MySQL печально известны своей медлительностью. Вы можете ускорить это с помощью соединения:

SELECT A.*
FROM
    tbl1 A
    INNER JOIN (
        SELECT DISTINCT col2
        FROM
            tbl2
        WHERE
            col3 = 2
    ) X ON X.col2 = A.ID
LIMIT 0, 1

Для обновления tbl1:

UPDATE
    tbl1 A
    INNER JOIN (
        SELECT DISTINCT col2
        FROM
            tbl2
        WHERE
            col3 = 2
    ) X ON X.col2 = A.ID
SET
    A.SomeCol = 'value'
0 голосов
/ 24 октября 2011

Добавьте индекс на tbl2, на col3 или (еще лучше) на (col3,col2).

Затем используйте это (нет необходимости в DISTINCT здесь):

SELECT * 
FROM tbl1 
WHERE ID IN (SELECT col2 FROM tbl2 WHERE col3 = 2) 
LIMIT  0,1

или даже лучше, чтобы избежать IN (SELECT ...), эта версия:

SELECT * 
FROM tbl1 t
WHERE EXISTS 
      ( SELECT * 
        FROM tbl2 t2
        WHERE t2.col3 = 2 
          AND t2.col2 = t.ID
      ) 
LIMIT  0,1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...