powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Комментарий в запросе
14 сообщений из 14, страница 1 из 1
Комментарий в запросе
    #38804240
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день
Попросили заняться оптимизацией запрос, т.к. при выборке сервер скушивал всю RAM и висел бесконечно долго, сам запрос в первоначальном виде такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT concat(torh.pos,'_',/*tosc.kkm_shift_number*/toso.number,'_',torh.local_number) 
as KEY_BONUS, tori.total_quantity, tori.total, tori.account_discount, tori.position, tori.item
FROM ukmserver.`trm_out_receipt_item` tori, ukmserver.`trm_out_receipt_header` torh, ukmserver.`trm_out_receipt_footer` torf, ukmserver.`trm_out_shift_close` tosc, ukmserver.`trm_out_shift_open` toso
where torh.card is not null 
	and torh.cash_id=tori.cash_id 
	and tori.receipt_header=torh.id 
	and torf.cash_id=tori.cash_id 
	and tori.receipt_header=torf.id  
	and torh.cash_id=/*tosc.cash_id*/toso.cash_id 	
	and torh.shift_open=/*tosc.id*/toso.id
	and torh.date>='2014.11.01'

Начал разбираться и первым что пришло в голову было сделать явные соединения таблиц, в результате родилось вот что:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT concat(torh.pos,'_',toso.number,'_',torh.local_number) 
as KEY_BONUS, tori.total_quantity, tori.total, tori.account_discount, tori.position, tori.item
FROM ukmserver.`trm_out_receipt_footer` torf 
	join  ukmserver.`trm_out_receipt_item` tori on (torf.cash_id=tori.cash_id  and torf.id=tori.receipt_header) 
	join  ukmserver.`trm_out_receipt_header` torh on (tori.cash_id=torh.cash_id and tori.receipt_header=torh.id) 
	join ukmserver.`trm_out_shift_open` toso on (torh.cash_id=toso.cash_id  and torh.shift_open=toso.id)
	where torh.card is not null  and torh.date>='2014.11.01'
и при переписывании я заметил,что делается в FROM указана таблица, условия выборки по которой закомментированы (ukmserver.`trm_out_shift_close` tosc) и убрал её. Запрос выполнился очень быстро и внес сомнения. Тогда я взял первоначальный запрос и просто убрал все закомментированые данные и таблицу, по которой нет выборки (ukmserver.`trm_out_shift_close` tosc). Запрос выполнился также быстро. Оказывается, наличие таблицы несет большую нагрузку, хотя в выборке вообще не участвует. Как такое может быть?
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804263
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Планы обоих запросов покажите.
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804273
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,
первый запрос:

+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+
| 1 | SIMPLE | toso | index | PRIMARY,id,date_idx,versions | number | 8 | NULL | 20448 | Using index |
| 1 | SIMPLE | torh | ref | PRIMARY,id,date,shift_open,versions | shift_open | 17 | ukmserver.toso.cash_id,ukmserver.toso.id | 74 | Using where |
| 1 | SIMPLE | torf | eq_ref | PRIMARY,versions | PRIMARY | 16 | ukmserver.toso.cash_id,ukmserver.torh.id | 1 | Using index |
| 1 | SIMPLE | tori | ref | PRIMARY,link_item,receipt_header,versions | receipt_header | 16 | ukmserver.toso.cash_id,ukmserver.torh.id | 2 | NULL |
+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+


второй:

+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+
| 1 | SIMPLE | toso | index | PRIMARY,id,date_idx,versions | number | 8 | NULL | 20450 | Using index |
| 1 | SIMPLE | torh | ref | PRIMARY,id,date,shift_open,versions | shift_open | 17 | ukmserver.toso.cash_id,ukmserver.toso.id | 74 | Using where |
| 1 | SIMPLE | torf | eq_ref | PRIMARY,versions | PRIMARY | 16 | ukmserver.toso.cash_id,ukmserver.torh.id | 1 | Using index |
| 1 | SIMPLE | tori | ref | PRIMARY,link_item,receipt_header,versions | receipt_header | 16 | ukmserver.toso.cash_id,ukmserver.torh.id | 2 | NULL |
+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+
4 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804278
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри,не то
первый запрос:

+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+----------------------------------------------------+
| 1 | SIMPLE | tosc | index | NULL | login | 8 | NULL | 20232 | Using index |
| 1 | SIMPLE | toso | index | PRIMARY,id,date_idx,versions | number | 8 | NULL | 20450 | Using index; Using join buffer (Block Nested Loop) |
| 1 | SIMPLE | torh | ref | PRIMARY,id,date,shift_open,versions | shift_open | 17 | ukmserver.toso.cash_id,ukmserver.toso.id | 74 | Using where |
| 1 | SIMPLE | torf | eq_ref | PRIMARY,versions | PRIMARY | 16 | ukmserver.toso.cash_id,ukmserver.torh.id | 1 | Using index |
| 1 | SIMPLE | tori | ref | PRIMARY,link_item,receipt_header,versions | receipt_header | 16 | ukmserver.toso.cash_id,ukmserver.torh.id | 2 | NULL |
+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+----------------------------------------------------+
5 rows in set (0.00 sec)


второй:

+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+
| 1 | SIMPLE | toso | index | PRIMARY,id,date_idx,versions | number | 8 | NULL | 20450 | Using index |
| 1 | SIMPLE | torh | ref | PRIMARY,id,date,shift_open,versions | shift_open | 17 | ukmserver.toso.cash_id,ukmserver.toso.id | 74 | Using where |
| 1 | SIMPLE | torf | eq_ref | PRIMARY,versions | PRIMARY | 16 | ukmserver.toso.cash_id,ukmserver.torh.id | 1 | Using index |
| 1 | SIMPLE | tori | ref | PRIMARY,link_item,receipt_header,versions | receipt_header | 16 | ukmserver.toso.cash_id,ukmserver.torh.id | 2 | NULL |
+----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804391
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

в первом случае выполняется CROSS JOIN c ukmserver.`trm_out_shift_close` tosc.
Это значит, что для каждой результирующей записи из остальных таблиц выбираются все записи из ukmserver.`trm_out_shift_close` tosc. Если второй запрос дает вам N записей, а ukmserver.`trm_out_shift_close` содержит M записей, то в итоге первого запроса получается N * M, что может быть довольно большим числом, и выборка может съесть все ресурсы.

Вероятнее всего, вместе с закомментированными сравнениями забыли закомментировать саму таблицу.
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804452
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диклевич Александр,это понятно,а почему тогда в запрос тянется таблица, выборка по которой явно не задана?
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804455
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarа почему тогда в запрос тянется таблица, выборка по которой явно не задана?так это надо спрашивать у авторов запроса...
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804463
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarДиклевич Александр,это понятно,а почему тогда в запрос тянется таблица, выборка по которой явно не задана?

заданы ли поля в SELECT из этой таблицы или нет - это не важно.
она же присутсвует в FROM. А так как в WHERE на нее нет ограничений, получается CROSS JOIN.

Я же говорю, ее просто забыли закомментировать в FROM, вот и все.
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804470
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диклевич Александрзаданы ли поля в SELECT из этой таблицы или нет - это не важно.+1
селект - это "что показывать"
а "что обрабатывать" - это фром(+вере+групбай)
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38804475
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

добавьте во второй запрос в конец всех JOIN'ов такое
Код: sql
1.
CROSS JOIN ukmserver.`trm_out_shift_close` tosc


и получите полный аналог первого запроса.
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38808057
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще есть разница в MySQL 6.5 в использовании явных и неявных джойнах?
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38808073
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarА вообще есть разница в MySQL 6.5 в использовании явных и неявных джойнах?MySQL 6.5 не существует. А вообще в MySQL разницы нет.
Иногда попадаются уверения, что будто-бы есть, но убедительного доказательства я еще не видел.

Более того, где-то тут на форуме пробегала ссылочка на некое исследование внутренностей MySQL, и там было показано, что внутри все джойны приводятся к одному виду перед выполнением.
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38808089
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,сорри, не 6.5,а 5.6. Т.е. оптимизатор всё равно запрос:
SELECT concat(torh.pos,'_',/toso.number,'_',torh.local_number)
as KEY_BONUS, tori.total_quantity, tori.total, tori.account_discount, tori.position, tori.item
FROM ukmserver.`trm_out_receipt_item` tori, ukmserver.`trm_out_receipt_header` torh, ukmserver.`trm_out_receipt_footer` torf, ukmserver.`trm_out_shift_open` toso
where torh.card is not null
and torh.cash_id=tori.cash_id
and tori.receipt_header=torh.id
and torf.cash_id=tori.cash_id
and tori.receipt_header=torf.id
and torh.cash_id=toso.cash_id
and torh.shift_open=toso.id
and torh.date>='2014.11.01'

приведет к :

SELECT concat(torh.pos,'_',toso.number,'_',torh.local_number)
as KEY_BONUS, tori.total_quantity, tori.total, tori.account_discount, tori.position, tori.item
FROM ukmserver.`trm_out_receipt_footer` torf
join ukmserver.`trm_out_receipt_item` tori on (torf.cash_id=tori.cash_id and torf.id=tori.receipt_header)
join ukmserver.`trm_out_receipt_header` torh on (tori.cash_id=torh.cash_id and tori.receipt_header=torh.id)
join ukmserver.`trm_out_shift_open` toso on (torh.cash_id=toso.cash_id and torh.shift_open=toso.id)
where torh.card is not null and torh.date>='2014.11.01'
...
Рейтинг: 0 / 0
Комментарий в запросе
    #38808122
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarТ.е. оптимизатор всё равно запрос:
...
приведет к :
...Исходя из того исследования - да.
Лично я туда не копал, поручится не могу.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Комментарий в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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