|
|
|
Помогите оптимизировать запрос в базу MySQL
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть один большой запрос, под спойлером. Изначально он был вот таким извращением http://pastebin.com/ukL7Hx5N В итоге у меня получилось то что под спойлером, из того что я сам не смог додумать, это как сократить часть с mpar, т.е. этот большой селект, который формирует "mpar.mparams" Сам я крайне плохо знаю все фишки для работы с SQL-ем, по этой причине вынужден просить помощи. Помогите оптимизировать эту большую часть, т.к. выборка со скоростью 180 секунд, крайне негативно сказывается на сайте, без этот mpars выборка проходит за 0.00022 секунды. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 03:49 |
|
||
|
Помогите оптимизировать запрос в базу MySQL
|
|||
|---|---|---|---|
|
#18+
Serious2008выборка со скоростью 180 секунд, крайне негативно сказывается на сайте, без этот mpars выборка проходит за 0.00022 секунды.Вырезаете подзапрос "mpar", ставите перед ним explain, выполняете, результат - сюда (лучше в теге fixed) Но вообще-то запрос сам по себе бредовый. Если его конкретно подсократить, то получится Код: sql 1. 2. 3. 4. Чувствуете дурь? А вот это Код: sql 1. , похоже, вообще собиралось автоматическим кодописцем... PS. А тему надо бы, наверное, перенести в соотв. подфорум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 06:51 |
|
||
|
Помогите оптимизировать запрос в базу MySQL
|
|||
|---|---|---|---|
|
#18+
Serious2008, Во-первых, ты не правильно думаешь (если ты это думаешь), что оптимизация запроса сводится к уменьшению размера текста запроса. Во-вторых, где у тебя в центре запроса запятая, должен быть JOIN. Ну и в заключении -- тут надо разбираться в постановке задачи, в твоей БД, и в запросе. Очевидно, что у тебя тут много вложенных group by по разным наборам полей, надо ли это -- не понятно, и можно ли это исправить -- тоже. Так что скорее всего тебе придётся попотеть самому. Или обратиться к профессионалам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 12:08 |
|
||
|
Помогите оптимизировать запрос в базу MySQL
|
|||
|---|---|---|---|
|
#18+
Serious2008, Думаю, запрос лучше заново наново переписывать, постигая его суть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 12:10 |
|
||
|
Помогите оптимизировать запрос в базу MySQL
|
|||
|---|---|---|---|
|
#18+
Т.к. вставляя в FIXED Результат с EXPLAIN получался кривоват, я сделал скрин. Я наконец-то понял принцип работы этой части mpar. Она собирает все параметры. Принцип у него вот такой. Из таблицы cat_filters выбираются значения вот с таким принципом Код: sql 1. Далее, я получаю, примерно такую таблицу Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Теперь дальше из таблицы goods_filters нужно выбрать очень хитрым образом данные. Нужно выбрать в соответствии с flt_id все данные. Т.е. условие что-то вроде Код: sql 1. но тут же опять, если есть в этой таблице параметр для g.id, то значение для p.id нужно игнорировать. Т.е. получаем для значения g.id = 3074 и p.id=2074 и cat_filters.flt_id =2943 Вот такую вещь Код: plaintext 1. 2. Теперь уже из таблицы filters_values нужно получить значение по столбцу value. Получаем вот такое. Код: plaintext 1. 2. И получить вот такую вещь. Код: plaintext 1. 2. Ширина|см=900||мм||-10 Если описывать то получается вот такая вещь. Код: sql 1. И если это не последний параметр то добавляем ещё в конце ";" Итог выполнения для одного товара Установка=каминная|пристеннаяс**а0;Режим работы=отвод / циркуляцияс**а0;Тип каминной вытяжки=каминная|пристеннаяс**а1;Тип встраивания=каминная|пристеннаяс**а2;Тип управления=механическое|ползунковоес**а0;Элементы управления=механическое|ползунковоес**а1;Тип освещения=лампа накаливанияс**а0;Количество ламп освещения=2|25 ||||0;Мощность каждой лампы|Вт=2|25 ||||1;Цвет=серебристыйс**а0;Немаркая поверхность=серебристыйс**а1;Ширина|см=900||мм||-10 Вот нужно чтобы собралась вот такая строка. Теперь у меня возникли сомнения, что изначальный вариант плохой. Я в SQL очень плох, так что я не знаю как оптимальней всего собирать эти данные :-( P.S. Перепроектировать всё не вариант, т.к. очень много вещей завязано на эту базу, и проектировал её не я. И изначальный запрос, тоже не моих рук дело. Мне дали базу, и сказали, что выбираются не все товары. Начал ковырять и нарвался на этот запрос, потом обнаружил лишнее условие, которое много чего резало, что не должно быть обрезано. tanglir PS. А тему надо бы, наверное, перенести в соотв. подфорум. Я не нашёл более подходящий подфорум :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 15:27 |
|
||
|
Помогите оптимизировать запрос в базу MySQL
|
|||
|---|---|---|---|
|
#18+
Попытался сам для начала составить просто запрос с одним товаром, без подстановки всех данных, чтобы в итоге сделать на JOIN-ах. Получилась вот такая вещь. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Но результат не очень, он компонует все полностью и из 2074 и 3074 Установка=||||0;Установка=каминная|пристеннаяс**а0;Режим работы=отвод / циркуляцияс**а0;Тип каминной вытяжки=||||1; Тип каминной вытяжки=каминная|пристеннаяс**а1;Тип встраивания=||||2;Тип встраивания=каминная|пристеннаяс**а2; Производительность|куб.м/ч=1260||м<sup>3</sup>/ч||0;Количество скоростей=4с**а0;Тип управления=электронноех..во0; Элементы управления=электронноех..во1;Тип освещения=галогенная лампас**а0;Количество ламп освещения=2|40 ||||0; Мощность каждой лампы|Вт=2|40 ||||1;Таймер=естьс**а0;Цвет=серебристыйс**а0;Немаркая поверхность=серебристыйс**а1; Ширина|см=900||мм||-10;Глубина/см=900||мм||-10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 20:44 |
|
||
|
Помогите оптимизировать запрос в базу MySQL
|
|||
|---|---|---|---|
|
#18+
Serious2008Далее, я получаю, примерно такую таблицу Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Нужно выбрать в соответствии с flt_id все данные. Т.е. условие что-то вроде Код: sql 1. но тут же опять, если есть в этой таблице параметр для g.id, то значение для p.id нужно игнорировать. Т.е. получаем для значения g.id = 3074 и p.id=2074 и cat_filters.flt_id =2943И вот тут я перестал что-либо понимать. Откуда 2074? и что это за таблица "p"? Serious2008Я не нашёл более подходящий подфорум :-(название этого подфорума - в заголовке темы :) PS. Судя по эксплейну, надо как минимум избавиться от подзапроса к таблицу remains. А лучше от обоих. PPS. если FIXED не работает как надо, то есть ещё CSV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 10:57 |
|
||
|
Помогите оптимизировать запрос в базу MySQL
|
|||
|---|---|---|---|
|
#18+
tanglirИ вот тут я перестал что-либо понимать. Откуда 2074? и что это за таблица "p"? Код: sql 1. 2. 3. 4. Это отсылка к основному запросу. g.id = 3074 - это id одного товара, а 2074 это его parent Это реальные данные я подставил, чтобы данные в таблицах получались ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 11:15 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38610469&tid=1540930]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
71ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 388ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...