|
|
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
Добрый день Попросили заняться оптимизацией запрос, т.к. при выборке сервер скушивал всю RAM и висел бесконечно долго, сам запрос в первоначальном виде такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Начал разбираться и первым что пришло в голову было сделать явные соединения таблиц, в результате родилось вот что: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 07:07:41 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
Планы обоих запросов покажите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 08:10:44 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 08:39:08 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
Сорри,не то первый запрос: +----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+----------------------------------------------------+ | 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 | +----+-------------+-------+--------+-------------------------------------------+----------------+---------+------------------------------------------+-------+-------------+ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 08:44:17 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
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, что может быть довольно большим числом, и выборка может съесть все ресурсы. Вероятнее всего, вместе с закомментированными сравнениями забыли закомментировать саму таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 10:17:02 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
Диклевич Александр,это понятно,а почему тогда в запрос тянется таблица, выборка по которой явно не задана? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 10:39:47 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
Gallemarа почему тогда в запрос тянется таблица, выборка по которой явно не задана?так это надо спрашивать у авторов запроса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 10:41:06 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
GallemarДиклевич Александр,это понятно,а почему тогда в запрос тянется таблица, выборка по которой явно не задана? заданы ли поля в SELECT из этой таблицы или нет - это не важно. она же присутсвует в FROM. А так как в WHERE на нее нет ограничений, получается CROSS JOIN. Я же говорю, ее просто забыли закомментировать в FROM, вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 10:44:49 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
Диклевич Александрзаданы ли поля в SELECT из этой таблицы или нет - это не важно.+1 селект - это "что показывать" а "что обрабатывать" - это фром(+вере+групбай) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 10:47:16 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
Gallemar, добавьте во второй запрос в конец всех JOIN'ов такое Код: sql 1. и получите полный аналог первого запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 10:49:30 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
А вообще есть разница в MySQL 6.5 в использовании явных и неявных джойнах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 12:05:04 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
GallemarА вообще есть разница в MySQL 6.5 в использовании явных и неявных джойнах?MySQL 6.5 не существует. А вообще в MySQL разницы нет. Иногда попадаются уверения, что будто-бы есть, но убедительного доказательства я еще не видел. Более того, где-то тут на форуме пробегала ссылочка на некое исследование внутренностей MySQL, и там было показано, что внутри все джойны приводятся к одному виду перед выполнением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 12:13:04 |
|
||
|
Комментарий в запросе
|
|||
|---|---|---|---|
|
#18+
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' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 12:19:22 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38804452&tid=1833929]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 382ms |

| 0 / 0 |
