powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL не использует ключ при inner join
12 сообщений из 12, страница 1 из 1
MySQL не использует ключ при inner join
    #39344056
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выявил ряд запросов в Битриксе, в которых в 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
MySQL не использует ключ при inner join
    #39344057
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
MySQL не использует ключ при inner join
    #39344599
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGL,
Поправки по Вашей просьбе внес. Проверьте, правильно ли теперь?
...
Рейтинг: 0 / 0
MySQL не использует ключ при inner join
    #39344602
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нафига использовать ключ на маленькой таблице, если потом её всё равно отдавать, а селективность походу не очень?
...
Рейтинг: 0 / 0
MySQL не использует ключ при inner join
    #39344970
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftYurikGL,
Поправки по Вашей просьбе внес. Проверьте, правильно ли теперь?

Все верно, большое спасибо.
AkinaА нафига использовать ключ на маленькой таблице, если потом её всё равно отдавать, а селективность походу не очень?
Это части гораздо более большого запроса. В нем "неиспользование ключа" дает увеличение времени исполнения в несколько раз.
из b_iblock_element_prop_s17 выборки идут достаточно часто.
...
Рейтинг: 0 / 0
MySQL не использует ключ при inner join
    #39344998
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну попробуй FORCE INDEX... а если сервер его проигнорит, то тебе просто не повезло.
...
Рейтинг: 0 / 0
MySQL не использует ключ при inner join
    #39345133
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так FORCE INDEX он не может проигнорить. Игнорит иногда USE INDEX.
Ну а вообще в чем суть вопроса? Mysql игнорит индексы потому что может.
...
Рейтинг: 0 / 0
MySQL не использует ключ при inner join
    #39346629
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
MySQL не использует ключ при inner join
    #39346682
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGL, нету идей) "надо смотреть". высылайте самолет и отложите командировочные )

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

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

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

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

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


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