DrunkMaster
@DrunkMaster

Как понять работу sql-запроса?

SELECT `group_id` FROM `vkgroups` WHERE `group_id` 
IN (SELECT * FROM (SELECT `group_id` FROM `vkmembers` ORDER BY `members` DESC LIMIT 0,20) temp_tab)

Первый запрос выполняется 3 секунды, если его повторить то 0,0001 Потом меняем LIMIT например на 20.20 или 40,20 всё повторяется - первый запрос 2-3 секунды, остальные очень быстрые.
EXPLAIN:
a3d28256d390407da94ab88087d85aeb.png

Результаты профилирования:

60141529025a4076a23e85a708d04b66.jpg3eafa4c554154573ab11bf5d6f9f6467.jpg
  • Вопрос задан
  • 662 просмотра
Решения вопроса 3
yarkov
@yarkov
Проект "Жизнь после смерти" - lifeafterdeath.ru
Запросы кэшируются
mysql> show variables like 'query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 10485760 |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 52428800 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
5 rows in set (0.20 sec)
Ответ написан
art_karetnikov
@art_karetnikov
Лучший мой проект: Мобильный банк Сбербанка РФ.
Попробуйте так. Результат одинаковый будет, но оптимизатор не станет выполнять лишний select
SELECT `group_id` FROM `vkgroups` WHERE `group_id`
IN (SELECT `group_id` FROM `vkmembers` ORDER BY `members` DESC LIMIT 0,20)

Т.е. что вижу я тут странное. Вот это подзапрос, который в скобках. Он отбирает нечто, обратно это сортирует и берет первые 20 записей из результата.
Условно, значения у вас идут от 10 до 100 - берутся записи от 100 и до 80. Фактически - возьми последние 20 записей
SELECT `group_id` FROM `vkmembers` ORDER BY `members` DESC LIMIT 0,20

Зачем делать из этого потом еще один запрос select * - не ведаю.

И совершенно непонятно, зачем брать абсолютно все данные и их потом переворачивать. Добавьте, например, условие сюда же по дате, или брать не все данные, а половину только и скорость увеличится.
Ответ написан
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Возможно у вас есть непонимание основ работы бд. Например
SELECT `group_id` FROM `vkmembers` ORDER BY `members` DESC LIMIT 0,20

возможно по вашему мнению быстренько выбирает 20 последних записей, что на самом деле не так.

PS: попробуй уменьшить query_cache хотя бы до 16 мб, а то и вовсе отключить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы