Медленный MYSQL-запрос с 500 000 записей - PullRequest
2 голосов
/ 29 декабря 2011

У меня в таблице MySQL около 500 000 записей. Размер таблицы составляет около 45 МБ. При первом выполнении запроса каждый раз это занимает почти 20 секунд, но последующие запросы выполняются быстро. Если я выйду из системы и снова войду в систему, запросы все еще будут быстрыми. Если я вернусь через 4-5 часов. Тот же запрос снова идет медленно.

Запрос довольно прост.

$query = "select * from tableName where uniqueID='$passedID' ORDER BY tableName ASC";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());

Сайт размещается на VPS с 1 ГБ памяти. Сайт получает около 150 посетителей в день, каждый посещает около 10 страниц. 500 000 записей не кажутся слишком большими, поэтому производительность должна быть хорошей. У кого-нибудь есть идеи, что может быть причиной медлительности?

Ответы [ 6 ]

1 голос
/ 29 декабря 2011

У этого оператора выбора может быть много проблем.

  1. Если в таблице запущено несколько обновлений или вставок и если таблица относится к myisam, то она заблокирует всю таблицу, что приведет к медленному запросу select.
  2. Также вам нужно проиндексировать поля условия where, чтобы получить результат за меньшее время.
  3. Выполните объяснение запроса и проверьте результат, что именно делает запрос при получении результата.

Для лучшего руководства по индексированию вы можете посетить этот сайт.

1 голос
/ 29 декабря 2011

Первоначальный медленный ответ может иметь несколько причин в зависимости от структуры вашей таблицы и производительности вашего VPS (или ее отсутствия).Чтобы убедиться, что проблема не в MySQL, убедитесь, что столбец ID правильно проиндексирован, поэтому он не выполняет полное сканирование таблицы.Также запустите объяснение запроса, чтобы убедиться, что он использует индекс.Вероятно, ваша проблема в отсутствии индекса, заставляющего MySQL выполнять полное сканирование таблицы вместо поиска по индексу.

Повторные запросы почти наверняка бывают быстрыми, потому что кэш запросов выполняет свою работу правильно.

Возможно, VPS также имеет проблемы с доступом к диску.Если вы видите условия вне PHP, когда первый доступ к папке медленный, а второй доступ нормальный, подозреваете проблему в VPS.

0 голосов
/ 29 декабря 2011

Вам необходимо применить индексацию в таблице к полю «уникальный идентификатор», поиск по индексу всегда быстрый. Как вы сказали, 500000 - это не много, и запрос должен возвращать результаты довольно быстро.

Кроме того, запрос выполняется быстрее при последующих вызовах, поскольку при выполнении запроса к базе данных записи буферизуются в буфере базы данных, и если тот же запрос выполняется, пока записи находятся в буфере, то он, очевидно, быстрее вернет результаты. Таким образом, через несколько часов буфер базы данных может быть перезаписан некоторыми другими данными, и поэтому запрос должен быть полностью возвращен в базу данных, чтобы снова извлечь записи в буфере.

0 голосов
/ 29 декабря 2011
  1. Глядя на имя поля "uniqueID", я предполагаю, что это уникальное поле в таблице. Если это так, то почему вы используете "заказ по ...."? Если поле уникально, то будет возвращена максимум одна запись, следовательно, нет необходимости в заказе.

  2. У вас есть поле с именем "tableName" в вашей таблице или это опечатка?

  3. У вас есть индекс на столе? Run

    показать индексы для tableName;

    и опубликуйте результат здесь, что позволит нам увидеть, правильно ли построен индекс.

0 голосов
/ 29 декабря 2011

Каждый раз, когда вы сталкиваетесь с медленными запросами, выполните EXPLAIN в запросе для отладки.

При этом вам нужно LIMIT результаты и INDEX ваш uniqueID столбец.

0 голосов
/ 29 декабря 2011

Возможно, вашу проблему можно решить, добавив индекс по столбцу uniqueID

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