MySQL блокирует (или как это оптимизировать) - PullRequest
2 голосов
/ 16 декабря 2010

У меня есть запрос в mySQL (MyISAM):

SELECT * FROM `links` WHERE `id` IN (SELECT `link` FROM `posts` WHERE `read_time`<'2010-10-16')

Мне кажется, это нормально, но MySQL зависает с ним.'links' - это таблица с 16000 строками, а 'posts' - около 5000 строк.'id' и 'link' являются основными

Я провел несколько тестов:

  1. Удалите все записи, кроме пары в каждой таблице.Он работает
  2. Сначала выполните внутренний запрос (SELECT link ОТ posts ГДЕ read_time <'2010-10-16') и выполните внешний запрос (SELECT * FROM <code>links ГДЕ * 1015)* IN («1232», «1354», «3324»)).Это работает
  3. Попробуйте обновить мою Ubuntu, но там написано, что это последняя версия mySQL (5.1.37-1ubuntu5.5)

Что происходит?Я нашел ошибку?Или я что-то не так делаю?

Ответы [ 3 ]

4 голосов
/ 16 декабря 2010

MySQL в настоящее время не так хорош в оптимизации операторов этой формы:

SELECT *
FROM some_table
WHERE x IN (subquery)

Это в База данных ошибок MySQL , и это должно быть исправлено в MySQL 5.6 и MySQL 6.0. Для решения вашей проблемы вы можете использовать JOIN вместо IN:

SELECT links.*
FROM links
JOIN posts ON links.id = posts.link
WHERE posts.read_time < '2010-10-16'

Вам также следует попробовать добавить индекс на read_time, если у вас его еще нет.

1 голос
/ 16 декабря 2010

Как предполагает Марк Байерс, используйте JOIN. Это очень доступное введение в СОЕДИНЕНИЯ .Вы также можете обратиться к документации MySQL по оператору JOIN .

0 голосов
/ 16 декабря 2010

В дополнение к Mark Byers, если возможно, используйте метку времени вместо datetime в read_time, если вы этого еще не сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...