У меня довольно простой SQL-запрос, но его выполнение занимает почти минуту:
SELECT
i.id,
...,
a.id AS albums_id,
...,
u.id AS users_id,
...
FROM
images i
LEFT JOIN albums a ON i.albums_id = a.id
LEFT JOIN users u ON a.users_id = u.id
WHERE
a.access = 'public'
AND i.num_of_views > 0
ORDER BY
i.num_of_views DESC
LIMIT
0, 60
Результат EXPLAIN для вышеуказанного запроса:
В таблицах участвуют:
images
(~ 4 822 000 строк), albums
(~ 149 000 строк), users
(~ 43 000 строк)
Соответствующие индексы:
albums
: доступ (access, num_of_images, album_time), access_2 (access, num_of_images, num_of_all_comments, album_time), users_id (users_id, album_time)
images
: browser_2 (num_of_views), album_id (album_id, image_order)
Все таблицы InnoDB, работающие на MySql v5.1.47
Так, как мне уменьшить это до секунды?
Пожалуйста, оставьте комментарий, если вам нужна дополнительная информация.
edit: users
таблица может быть объединена либо с albums
, либо images
для меня не имеет значения.
edit2: перемещение a.access = 'public'
из WHERE
в JOIN
действительно решает мою проблему, но возвращаемые результаты не верны (я получаю изображения из альбомов, которые не являются общедоступными), помещая a.access ...
в оба WHERE
и JOIN
замедляет запрос еще больше, чем раньше.