Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL не использует ключ при inner join / 12 сообщений из 12, страница 1 из 1
09.11.2016, 11:10
    #39344056
YurikGL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
Выявил ряд запросов в Битриксе, в которых в inner join не используется первичный ключ.
После значительного упрощения получились запросы (указаны ниже). Два из них используют первичный ключ при inner join, а два - нет. Отличаются возвращаемыми таблицами.
Поля "b_iblock_element_prop_s17.IBLOCK_ELEMENT_ID" и "b_iblock_element.ID" - первичные ключи соответствующих таблиц.

Код: sql
1.
2.
3.
4.
5.
6.
/*Ключ не используется 
select_type=SIMPLE; talble=b_iblock_element_prop_s17; type=ALL; possible_keys=RIMARY; key=null; key_len=null; ref=null; rows=3358; Extra=null*/
explain
select b_iblock_element_prop_s17.*
from b_iblock_element
INNER JOIN b_iblock_element_prop_s17 ON b_iblock_element_prop_s17.IBLOCK_ELEMENT_ID = b_iblock_element.ID



Код: sql
1.
2.
3.
4.
5.
6.
/*Ключ не используется
select_type=SIMPLE; talble=b_iblock_element_prop_s17; type=ALL; possible_keys=RIMARY; key=null; key_len=null; ref=null; rows=3358; Extra=null*/
explain
select b_iblock_element_prop_s17.*
from b_iblock_element_prop_s17
INNER JOIN b_iblock_element ON b_iblock_element.ID=b_iblock_element_prop_s17.IBLOCK_ELEMENT_ID 



Код: sql
1.
2.
3.
4.
5.
6.
/*Ключ используется
select_type=SIMPLE; talble=b_iblock_element_prop_s17; type=index; possible_keys=RIMARY; key=PRIMARY; key_len=4; ref=null; rows=51103; Extra=Using index*/
explain
select b_iblock_element.*
from b_iblock_element
INNER JOIN b_iblock_element_prop_s15 ON b_iblock_element_prop_s15.IBLOCK_ELEMENT_ID = b_iblock_element.ID




Код: sql
1.
2.
3.
4.
5.
6.
/*Ключ используется
select_type=SIMPLE; talble=b_iblock_element_prop_s17; type=index; possible_keys=RIMARY; key=PRIMARY; key_len=4; ref=null; rows=51103; Extra=Using index*/
explain
select b_iblock_element.*
from b_iblock_element_prop_s17
INNER JOIN b_iblock_element ON b_iblock_element.ID=b_iblock_element_prop_s17.IBLOCK_ELEMENT_ID 



analyze table на обе таблицы говорит, что все хорошо.

Какие есть идеи почему так может быть? В итоге нужны данные, вытаскиваемые первыми запросами.
Начало тут http://www.sql.ru/forum/1237567/dolgaya-sortirovka-v-zaprose
...
Рейтинг: 0 / 0
09.11.2016, 11:11
    #39344057
YurikGL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
YurikGL,

/*Ключ используется
select_type=SIMPLE; talble=b_iblock_element_prop_s17; type=ALL; possible_keys=RIMARY; key=PRIMARY; key_len=4; ref=null; rows=51103; Extra=Using index*/

везде читать
/*Ключ используется
select_type=SIMPLE; talble=b_iblock_element_prop_s17; type=index ; possible_keys=RIMARY; key=PRIMARY; key_len=4; ref=null; rows=51103; Extra=Using index*/

опечатался (
...
Рейтинг: 0 / 0
10.11.2016, 10:18
    #39344599
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
YurikGL,
Поправки по Вашей просьбе внес. Проверьте, правильно ли теперь?
...
Рейтинг: 0 / 0
10.11.2016, 10:22
    #39344602
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
А нафига использовать ключ на маленькой таблице, если потом её всё равно отдавать, а селективность походу не очень?
...
Рейтинг: 0 / 0
10.11.2016, 15:26
    #39344970
YurikGL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
miksoftYurikGL,
Поправки по Вашей просьбе внес. Проверьте, правильно ли теперь?

Все верно, большое спасибо.
AkinaА нафига использовать ключ на маленькой таблице, если потом её всё равно отдавать, а селективность походу не очень?
Это части гораздо более большого запроса. В нем "неиспользование ключа" дает увеличение времени исполнения в несколько раз.
из b_iblock_element_prop_s17 выборки идут достаточно часто.
...
Рейтинг: 0 / 0
10.11.2016, 15:44
    #39344998
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
Ну попробуй FORCE INDEX... а если сервер его проигнорит, то тебе просто не повезло.
...
Рейтинг: 0 / 0
10.11.2016, 18:03
    #39345133
netwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
так FORCE INDEX он не может проигнорить. Игнорит иногда USE INDEX.
Ну а вообще в чем суть вопроса? Mysql игнорит индексы потому что может.
...
Рейтинг: 0 / 0
14.11.2016, 10:21
    #39346629
YurikGL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
netwindтак FORCE INDEX он не может проигнорить. Игнорит иногда USE INDEX.
Ну а вообще в чем суть вопроса? Mysql игнорит индексы потому что может.

/*Ключ не используется
select_type=SIMPLE; talble=b_iblock_element_prop_s17; type=ALL; possible_keys=RIMARY; key=null; key_len=null; ref=null; rows=3358; Extra=null*/
explain
select b_iblock_element_prop_s17.*
from b_iblock_element_prop_s17 force index (primary)
INNER JOIN b_iblock_element ON b_iblock_element.ID=b_iblock_element_prop_s17.IBLOCK_ELEMENT_ID ;

Проигнорил. Еще идеи?
...
Рейтинг: 0 / 0
14.11.2016, 11:10
    #39346682
netwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
YurikGL, нету идей) "надо смотреть". высылайте самолет и отложите командировочные )

3358 rows - выглядит достаточно небольшим числом.
Видимо последние версии mysql все же отходят от ранее известной прямолинейности, когда force index фактически четко задает план. Или такой план совсем абсурден.

Я вообще считают оптимизацию битриксовских запросов непрактичной.
Отвалят за лицензию по 60 тыщ, а потом ради одного блока всем мозги парят.
Ставьте ssd в radi0. Если сортировки замучали - сделайте ramdrive для tmpdir.
...
Рейтинг: 0 / 0
14.11.2016, 13:08
    #39346792
YurikGL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
netwindYurikGL, нету идей) "надо смотреть". высылайте самолет и отложите командировочные )

3358 rows - выглядит достаточно небольшим числом.
Видимо последние версии mysql все же отходят от ранее известной прямолинейности, когда force index фактически четко задает план. Или такой план совсем абсурден.

Я вообще считают оптимизацию битриксовских запросов непрактичной.
Отвалят за лицензию по 60 тыщ, а потом ради одного блока всем мозги парят.
Ставьте ssd в radi0. Если сортировки замучали - сделайте ramdrive для tmpdir.

Последнее уже сделано. Таки хотелось бы с ключем запустить.
указанная таблица она для примера. Есть где гораздо больше записей и та же проблема.
...
Рейтинг: 0 / 0
14.11.2016, 13:55
    #39346835
netwind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
YurikGL, ну тогда это значит на больших все же должен заработать.
...
Рейтинг: 0 / 0
14.11.2016, 19:44
    #39347089
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL не использует ключ при inner join
netwindЯ вообще считают оптимизацию битриксовских запросов непрактичной.В целом соглашусь. Но, однако, десяток-полтора индексов я себе уже насоздавал. Попыток было больше, но остальные пользы не принесли.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL не использует ключ при inner join / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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