Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не задействуется индекс в подзапросе / 13 сообщений из 13, страница 1 из 1
18.03.2014, 15:36:26
    #38589591
e_moon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
Здравствуйте,

Прошу помочь разобраться! Не могу понять почему не спользуется primary-индекс в основном запросе. Задача - выбрать по одной последней записи с фоткой для каждого пользователя (таковых всего 10, но перебирает все 1489):


Код: sql
1.
2.
3.
EXPLAIN SELECT * FROM as_data WHERE `id` IN (
SELECT max(`id`) FROM as_data WHERE `photos` LIKE "%jpg%" GROUP BY `user_id` ORDER BY max(`id`)
) ORDER BY `id` DESC



1) PRIMARY as_data ALL NULL 1489 NULL Using where; Using filesort
2) DEPENDENT SUBQUERY as_data index user_id 4 NULL 10 Using where; Using filesort
...
Рейтинг: 0 / 0
18.03.2014, 15:37:55
    #38589593
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
Версия MySQL какая?

Скорее всего до 5.6. А если так, то переписывайте констуркцию IN (SELECT ...) через JOIN.
...
Рейтинг: 0 / 0
18.03.2014, 15:42:46
    #38589606
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
кажись вот это не дает индексу работать
Код: sql
1.
LIKE "%jpg%"
...
Рейтинг: 0 / 0
18.03.2014, 15:43:15
    #38589607
e_moon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
miksoftВерсия MySQL какая?

Скорее всего до 5.6. А если так, то переписывайте констуркцию IN (SELECT ...) через JOIN.

Версия программы: 5.5.25 - MySQL Community Server (GPL)

Ок, попробую покапаться...
...
Рейтинг: 0 / 0
18.03.2014, 15:44:11
    #38589608
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
e_moon,
странный запрос, а что надо, может все намного проще?
...
Рейтинг: 0 / 0
18.03.2014, 15:48:18
    #38589622
e_moon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
bochkovкажись вот это не дает индексу работать
Код: sql
1.
LIKE "%jpg%"



Нет, не повлияло. В самом подзапросе индекс (user_id) используется.

Бред какой-то, но забавно... Добавил LIMIT:
Код: sql
1.
SELECT * FROM as_data WHERE `id` IN (SELECT max(`id`) FROM as_data WHERE `photos` LIKE "%jpg%" GROUP BY `user_id`) ORDER BY `id` DESC LIMIT 0,10



EXPLAINE пишет теперь - все ок, используется индекс PRIMARY. Но сам запрос (не EXPLAIN, а выборка) происходит за 38 сек.
...
Рейтинг: 0 / 0
18.03.2014, 15:49:50
    #38589624
e_moon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
bochkove_moon,
странный запрос, а что надо, может все намного проще?

Задача - выбрать по одной последней записи с фоткой для каждого пользователя.

Т.е.:

Вася, последняя запись с фото была 17.03.2014
Петя, последняя запись с фото была 16.03.2014
...
...
Рейтинг: 0 / 0
18.03.2014, 15:57:13
    #38589640
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
Код: sql
1.
2.
3.
4.
SELECT * 
FROM (SELECT max(`id`) id FROM as_data WHERE `photos` LIKE "%jpg%" GROUP BY `user_id`) AS r
JOIN as_data AS a ON r.id=a.id
ORDER BY r.`id`
...
Рейтинг: 0 / 0
18.03.2014, 15:58:29
    #38589642
e_moon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
Попробовал составить JOIN - индексы в пролете... Короче, не могу сообразить. Не подкините какой-нибудь пример?

SELECT * FROM as_data WHERE id IN (
SELECT MAX(id)
FROM as_data
INNER JOIN (
SELECT MAX(pubdate) AS maxdate, user_id
FROM as_data
GROUP BY user_id
) AS ms ON as_data.pubdate=ms.maxdate AND as_data.user_id=ms.user_id
GROUP BY as_data.user_id
)
...
Рейтинг: 0 / 0
18.03.2014, 16:02:17
    #38589653
e_moon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
bochkov,

спасибо, работает и быстро! Хотя и обходит все-равно все 1489 записи. Вот какой EXPLAIN:

1) PRIMARY <derived2> ALL NULL NULL NULL NULL 9 Using filesort
1) PRIMARY a eq_ref PRIMARY PRIMARY 4 r.id 1
2) DERIVED as_data ALL NULL NULL NULL NULL 1489 Using where; Using temporary; Using filesort
...
Рейтинг: 0 / 0
18.03.2014, 16:06:27
    #38589663
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
e_moon,
так он и должен все записи обойти,
LIKE "%jpg%" убирай и индекс (user_id,id) поставь
...
Рейтинг: 0 / 0
18.03.2014, 16:09:22
    #38589671
e_moon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
bochkov,

ок, спасибо вам большое! Все понял!
...
Рейтинг: 0 / 0
19.03.2014, 15:49:04
    #38590811
Диклевич Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не задействуется индекс в подзапросе
e_moon,

можно еще через NOT EXISTS попробовать, что-то вроде
Код: sql
1.
2.
3.
4.
5.
6.
SELECT a.* 
FROM as_data a
WHERE 1 = 1
   AND NOT EXISTS(SELECT b.* FROM as_data b WHERE b.`user_id` = a.`user_id` AND b.id > a.id)
   AND a.`photos` LIKE "%jpg%"
ORDER BY a.`id`
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не задействуется индекс в подзапросе / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]