|
|
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Добрый день, столкнулся с необходимостью оптимизировать ряд запросов и постоянно натыкаюсь на USING temprory, собственно сам запрос Код: sql 1. 2. 3. 4. 5. А вот что получаю в результате Код: plaintext 1. 2. 3. Код: 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. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. Я уже понатыкал ключей "лишь бы были" так и это не помагает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 11:34:44 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Добавлю подсветку, ежели ты сам не умеешь... Light91собственно сам запрос Код: sql 1. 2. 3. 4. 5. 6. Ты сортируешь данные одной таблицы по данным другой. Чтобы выполнить сортировку, нужно сначала получить совокупную таблицу. Это невозможно сделать без USING temporary. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 11:40:17 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Конкретно для этого запроса я бы попробовал индекс (SORT, ID, IBLOCK_ID) на таблице b_iblock_element. Но, во-первых, запрос не похож на логичный. Во-вторых, а что это вы в битриксе запросы правите? Неужто кощунствуете, ядро правя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 11:44:32 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Я бы предложил индекс (IBLOCK_ID,SORT), и select be.IBLOCK_ID вместо B.ID. Да и FROM b_iblock - так ли уж необходимо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 11:50:18 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Cygapb-007Да и FROM b_iblock - так ли уж необходимо?Всмысле - при наличии FK достаточно отфильтровать NOT NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 11:53:27 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Ну давайте по порядку, нет, я не вношу правок в ядро и не склонен этого делать, просто раскручиваю сложные запросы и пытаюсь разобраться как их можно оптимизировать за счет создания ключей и/или правок настроек mysql. Так что нужно пожалуй уточнить, никаких изменений запроса сделать не смогу. Индексы сейчас попробую добавить. Спасибо за скорые ответы. Ты сортируешь данные одной таблицы по данным другой. Чтобы выполнить сортировку, нужно сначала получить совокупную таблицу. Это невозможно сделать без USING temporary. А вот это уже интересно, что скажешь об этом? EXPLAIN SELECT SQL_NO_CACHE B.ID FROM b_iblock B INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID ORDER BY BE.SORT asc ,BE.ID desc LIMIT 200; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE BE ALL ix_iblock_element_1,ix_iblock_element_4,ix_iblock_element_code,IBLOCK_ID 50990 Using filesort 1 SIMPLE B eq_ref PRIMARY PRIMARY 4 test4.BE.IBLOCK_ID 1 Using index Запрос выполнил на другой версии mysql, с другими настройками, тндексы по моемпу те ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 12:01:43 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
по моему те же. ps Не могу отредактировать своё предыдущее сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 12:02:49 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Light91, по-моему, Вам дан правильный совет - трансформировать запрос в Код: sql 1. 2. 3. 4. ну или во всякоразное Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 13:14:35 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
AkinaLight91, по-моему, Вам дан правильный совет - трансформировать запрос в не совсем так: Код: sql 1. 2. 3. 4. Тот же результат Да и нафига сортировка, если ее не видно? Хотя если запросы исправить нельзя, только индексы и остаются для подстройки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 13:27:46 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Опс, сорь, протупил с лимитом... Нужна сортировка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 13:29:05 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Light91Добрый день, столкнулся с необходимостью оптимизировать ряд запросов и постоянно натыкаюсь на USING temprory, собственно сам запрос [src sql] EXPLAIN SELECT SQL_NO_CACHE B.ID FROM b_iblock B INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID ORDER BY BE.SORT ASC , BE.ID DESC LIMIT 200 Само по себе USING temporary -- ни хорошо, и ни плохо, так что избавляться от него как такового не нужно. Но конкретно тут у тебя плохой запрос, в нём нет WHERE вообще, а значит, сортируются все записи, а затем из них отбираются 200 первых. Тут надо избавляться от USING temprory, точнее, надо ускорять сортировку. Для этого запроса достаточно создать индекс по двум условиям сортировки (SORT ASC , ID DESC) на таблицу b_iblock_element. (индекс, естественно, BTREE) Теперь надо вспомнить, умеет ли MySQL создавать индексы с явно указанной сортировкой... глядим: https://dev.mysql.com/doc/refman/5.0/en/create-index.html авторAn index_col_name specification can end with ASC or DESC. These keywords are permitted for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order. Ой-ёй! Не умеет... А последняя версия 5.7 ? -- ай, тоже нет... Ну, ты, мужик, попал! Тебе либо надо избавиться от второго поля в ORDER BY BE.SORT ASC, BE.ID DESC , если по логике приложения это подходит, либо сделать другое поле, зависимое от be.ID, и растущее в противоположную сторону, и по нему сортировать и создавать индекс с его участием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 13:30:41 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
MasterZivДля этого запроса достаточно создать индекс по двум условиям сортировки (SORT ASC , ID DESC) на таблицу b_iblock_element. (индекс, естественно, BTREE) Стесняюсь напомнить, что индекс по SORT уже есть, а ID - РК, то есть содержится в любом другом индексе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 13:35:23 |
|
||
|
Хочу избавиться от USING temporary
|
|||
|---|---|---|---|
|
#18+
Cygapb-007MasterZivДля этого запроса достаточно создать индекс по двум условиям сортировки (SORT ASC , ID DESC) на таблицу b_iblock_element. (индекс, естественно, BTREE) Стесняюсь напомнить, что индекс по SORT уже есть, а ID - РК, то есть содержится в любом другом индексе... Я не смотрел структуру... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2015, 13:47:31 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39043254&tid=1832756]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
20ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 311ms |

| 0 / 0 |
