|
|
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
Есть ли вариант оптимизировать такой запрос? SELECT count(w.id) as t_num, w.* FROM w_table w, w_tag_relation r, w_tag_relation r2 WHERE w.public='1' and w.added_at<'1379285739' AND r.r_wid='9056' AND r2.r_tid=r.r_tid AND w.id = r2.r_wid AND w.id!='9056' GROUP BY w.id ORDER BY t_num DESC LIMIT 0,4 Запрос выводить похожие статьи. Фигурируют 3 таблицы основная таблица w_table id|tags|added_at|public Таблица с идентификаторами тегов w_tag_relation r_wid|r_tid Где r_wid = w_table.id А r_tid = w_tag.t_id Таблица с тегами w_tag t_id|t_name Я в sql плохо разбираюсь и не пойму зачем тут count и дублирование таблицы w_tag_relation r2 Включил профилирование в codeigniter, все запросы выполняются по 0.006-0.010 А этот аж 0.1546 Можно ли как то перестроить запрос чтобы он побыстрее работал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 03:11:47 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
ms-dred, 1. пожалуйста, ставьте перевод строки перед каждым "AND" 2. поставьте слово EXPLAIN перед этим СКЛ и выдайте результат сюда --- сразу будет понятно сколько у вас записей и каких индексов (возможно) нехватает. 3. суть запроса вполне ясна: вывести 4 статейки которые связаны наибольшим количеством обших тагов с данной статейки. Начинается запрос с таблицы связок R -- найти все таги статьи 9056 AND r.r_wid='9056' затем найти все похожие таги в таблице связок R2 AND r2.r_tid=r.r_tid затем найти все статьи с этими тагами: AND w.id = r2.r_wid Дополинительные исловия и исключение оригинальной статьи: w.public='1' and w.added_at<'1379285739' AND w.id!='9056' затем группировка -- подсчет самых частво встречаемых (т.е. повторяюшихся, т.е. имеюших много совпадаюших тагов) стеек, сортировка и вывод первых четырех. Диагноз -- или индексов нехватает или мускл не понял с какой таблицы начать. После того как вы выдадите ЕХПЛАЙН, можно будет посоветовать индексы и/или добавить STRAIGHT для явного указания порадка и/или переписать запрос --- например групировку, сортировку и лимит лучше делать на втором этапе после подключения R2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 04:45:28 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
пардон, групировку и посчет можно делать на втором этапе, но лимит 4 надо делать только на третьем этапе после дополнительных условий на статьи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 04:47:47 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
авторДиагноз -- или индексов нехватает или мускл не понял с какой таблицы начать. вы смеетесь или издеваетесь? диагноз - запрос кривой как бумеранг. аргументация - не все поля в кляузе group by ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 05:07:38 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторДиагноз -- или индексов нехватает или мускл не понял с какой таблицы начать. вы смеетесь или издеваетесь? диагноз - запрос кривой как бумеранг. аргументация - не все поля в кляузе group by >> аргументация - не все поля в кляузе group by и да и нет. С точки зрения функциональности -- запрос абсолютно коректен -- это один из тех редких варинатов когда неполный ГРОУП БУ допустим. С точки зрения скорости -- да, вы скорее правы -- лучше сделать групировку и посчет на втором этапе а не на третьем (как я сказал в предыдушем посте) И самое главное -- человек попросил ускорить запрос. Я подозреваю что исправлением индексов и/или перестройкой запроса (например использованием СТРАЙТ) можно будет получить более серьезный выигрыш чем переносом группировки из третьего на второй этап. Давайте подождем ресультатов експлейна а потом дообсудим. Ибо лень гадать и тем более спорить не о чем ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 05:57:05 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
авторEXPLAIN SELECT COUNT( w.id ) AS t_num, w . * FROM w_table w, w_tag_relation r, w_tag_relation r2 WHERE w.public = '1' AND w.added_at < '1379285739' AND r.r_wid = '9056' AND r2.r_tid = r.r_tid AND w.id = r2.r_wid AND w.id != '9056' GROUP BY w.id ORDER BY t_num DESC LIMIT 0 , 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 06:32:15 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
ms-dredавторEXPLAIN SELECT COUNT( w.id ) AS t_num, w . * FROM w_table w, w_tag_relation r, w_tag_relation r2 WHERE w.public = '1' AND w.added_at < '1379285739' AND r.r_wid = '9056' AND r2.r_tid = r.r_tid AND w.id = r2.r_wid AND w.id != '9056' GROUP BY w.id ORDER BY t_num DESC LIMIT 0 , 4 ок, более менее понятно. порадок прохода таблиц -- правильный. надо создать индекс одиночный r_WID или двойной R_WID_TID. Ваш сушествуюшик индекс T_TID_WID подходит во воторой строчке EXPLAIN но не подходит в первой строчке -- тут то и потерялась скорость. Если с индексом T_WID_TID ксорость будет приемлемая -- то можно пить пиво, если вскорость все еше не устраивает, то будем переносить агрегацию на втрорй этап из первого, хотя дополнительный выигрыш будет не такой заметный..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 06:46:17 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
я если честно плоховато понимаю о чем речь =) предположил что нужно в таблице w_tag_relation Добавить index r_wid index После создания index время увеличилось стал исполняться ~0.1540 после удалил index ~0.1470 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 07:03:37 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
ms-dred, ок , покажите результаты: > SHOW CREATE TABLE w_table > SHOW CREATE TABLE w_tag_relation > select count(1) from w_table > select count(1) cnt1, count(distinct r_wid) cnt2, count(distinct r_wid) cnt3 from w_tag_relation > explain select * from w_tag_relation r where r.r_wid='9056' > explain select * from w_tag_relation r where r.r_wid= 9056 > select count(1) from w_tag_relation r where r.r_wid='9056' измерить скорость > select * from w_tag_relation r where r.r_wid='9056' > select * from w_tag_relation r, w_tag_relation r2, where r.r_wid='9056' and r2.r_tid=r.r_tid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 07:40:17 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
на всекий сделайте еше OPTIMIZE TABLE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 07:42:59 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
упс, скорость не верную предоставил, обновлял страницу и видать mysql кешировал запросы, если перейти в другую статью скорость выполнения запроса ~ от 0.2900 - 0.3544 варьируется >select count(1) from w_table выводит count(1) 8479 >select count(1) cnt1, count(distinct r_wid) cnt2, count(distinct r_wid) cnt3 from w_tag_relation выводит cnt1 cnt2 cnt3 76255 8495 8495 > explain select * from w_tag_relation r where r.r_wid='9056' > explain select * from w_tag_relation r where r.r_wid= 9056 Выводит, прикрепил снимком > select count(1) from w_tag_relation r where r.r_wid='9056' count(1) 9 скорость запроса > select * from w_tag_relation r where r.r_wid='9056' 0.0004 скорость запроса > select * from w_tag_relation r, w_tag_relation r2 where r.r_wid='9056' and r2.r_tid=r.r_tid 0.0060 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 07:56:12 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
забыл прикрепить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 07:56:56 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
ms-dred, Вот так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. должен выглядеть твой запрос. Существенно тут только то, что я убрал все колонки, которые были указаны из таблицы w. При использовании GROUP BY поля должны либо быть под агрегатными функциями (COUNT, AVG etc), либо быть указаны в GROUP BY, ВСЕ!!!. MySQL не ограничивает тебя в этом вопросе, разрешая нестандартные вольности, но как он при этом себя ведёт -- неизвестно. (да плохо ведёт в общем). Если тебе таки нужны остальные колонки из w, то Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Именно оптимизировать тут особенно нечего. попробуй такой вариант (ы) , очень возможно, что MySQL "шалил" на старом запросе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 14:41:33 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
На счёт оптимизации. Запрос по сути своей сложный. Тут ничего не поделать. это нахождение максимального по мощности пересечения наборов тегов. Придётся найти все пересечения, отсортировать, и затем взять 4 top. Помочь могут только фильтры -- w.public='1' and w.added_at<'1379285739' AND r.r_wid='9056' AND w.id!='9056' Если какие-то фильтры ещё можно добавить -- добавляй. Если нет -- всё, особенно, кроме проверки, что есть индексы на w.added_at и r.r_wid ничего не сделаешь. Ну, можно ещё сервак сам оптимизировать, дать больше памяти там, и всё такое прочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 14:46:59 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
Все же покажите > SHOW CREATE TABLE w_table > SHOW CREATE TABLE w_tag_relation Что-то у вас странное происходит. ЕКСПЛЕЙ дает то ПРИМАРУ, то Т_ВИД индекс при поиске по R, при этом всегда выдает 9 ROWS но иногда filesort а иногда просто index. При этом отличная милисекундная скорость. Без поллитра и без SHOW CREATE не обойтись. автор>select count(1) from w_table выводит count(1) 8479 ОК, нормально количество, не мало не много. автор>select count(1) cnt1, count(distinct r_wid) cnt2, count(distinct r_wid) cnt3 from w_tag_relation выводит cnt1 cnt2 cnt3 76255 8495 8495 Ну примерно десяток статей на один таг. Нормально. Тут я хотел посмотреь также р_ТИД , опечатался ...count(distinct r_tid) cnt3 автор> explain select * from w_tag_relation r where r.r_wid='9056' > explain select * from w_tag_relation r where r.r_wid= 9056 Выводит, прикрепил снимком Ок, но почему ПРИМАРИ??? илли он у вас, дефакто, двойной (TID, WID)? нужен SHOW CREATE TABLE !!!!!!!!!!!!!!!! автор> select count(1) from w_tag_relation r where r.r_wid='9056' count(1) 9 скорость запроса > select * from w_tag_relation r where r.r_wid='9056' 0.0004 Отлично авторскорость запроса > select * from w_tag_relation r, w_tag_relation r2 where r.r_wid='9056' and r2.r_tid=r.r_tid 0.0060 Отлично теперь пойдем дальше: Выдайте результат >> select count(1) from w_tag_relation r, w_tag_relation r2 where r.r_wid='9056' and r2.r_tid=r.r_tid Выдайте результат >> explain select count(1) cnt, r2.wid where r.r_wid='9056' and r2.r_tid=r.r_tid group by r2.wid Выдайте скорость >> select count(1) cnt, r2.wid where r.r_wid='9056' and r2.r_tid=r.r_tid group by r2.wid Выдайте результат >> explain select cnt, w.* from ( select count(1) cnt, r2.wid where r.r_wid='9056' and r2.r_tid=r.r_tid and r2.wid !='9056' group by r2.wid ) zz STRAIGHT_JOIN w_table w on w.public='1' and w.added_at<'1379285739' AND w.id = r2.r_wid Выдайте скорость >> select cnt, w.* from ( select count(1) cnt, r2.wid where r.r_wid='9056' and r2.r_tid=r.r_tid and r2.wid !='9056' group by r2.wid ) zz STRAIGHT_JOIN w_table w on w.public='1' and w.added_at<'1379285739' AND w.id = r2.r_wid повторите два последних запросa (експлейн и скорость) добавив в самом конце ... order by cnt desc limit 0,4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 18:18:35 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
MasterZiv, да нужны данные из таблицы w, поэтому первый вариант не подошел, а вот второй существенно снизил время выполнения, было от 0.2900 - 0.3544, стало 0.0522, при перезагрузки страницы показывает вобще 0.0200 и это очень радует. Спасибо большое. Решил еще попробовать указать нужные поля для вывода, в таблице их около 15, указал так select w1.id,w1.img,w1.tags,w1.name , w2.* ...... время выполнения вроде бы изменилось, но совсем не существенно. javajdbc, в принципе выше запросом уже доволен, но все же если еще получиться снизить время выполнения, тогда можно и продолжить =) Прошу прощения, у меня в параметрах стояла галочка сокращать тексты и я после выполнения ниже приведенных 2-х запросов подумал что это не важно =) Порставил галочку выводить полуную информацию и вот что выводят они > SHOW CREATE TABLE w_table Выводит Код: 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. > SHOW CREATE TABLE w_tag_relation Код: sql 1. 2. 3. 4. 5. 6. авторБез поллитра и без SHOW CREATE не обойтись. xD авторТут я хотел посмотреь также р_ТИД , опечатался ...count(distinct r_tid) cnt3 По запросу Код: sql 1. 2. 3. 4. Выводит cnt1 cnt2 cnt3 76255 8495 8652 авторавтор > explain select * from w_tag_relation r where r.r_wid='9056' > explain select * from w_tag_relation r where r.r_wid= 9056 Выводит, прикрепил снимком Ок, но почему ПРИМАРИ??? илли он у вас, дефакто, двойной (TID, WID)? нужен SHOW CREATE TABLE !!!!!!!!!!!!!!!! t_wid не уникальное поле и в основном оно дублируются в таблице 5 -10 раз а t_tid еще больше, так как оно содержит индекс w_tag.id (в таблице w_tag.name название тега) авторВыдайте результат >> select count(1) from w_tag_relation r, w_tag_relation r2 where r.r_wid='9056' and r2.r_tid=r.r_tid count(1) 3267 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. а что за cnt, ошибку выдает авторYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where r.r_wid='9056' and r2.r_tid=r.r_tid group by r2.wid' at line 2 и с последующими sql тоже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 19:44:25 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
ms-dred, Нда, не ожидал такogo тормоза от mysql при обработке неполного group by... 0.05 уже хорошая скорость (запрос ор MasterZiv) Единствено что осталось проверить скорость: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 20:14:12 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
Ошибка базы данных. Error Number: 1054 Unknown column 'r2.wid' in 'field list' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 20:18:58 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
иправьте везде на r_wid Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 20:36:32 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
авторОшибка базы данных. Error Number: 1052 Column 'r_wid' in field list is ambiguous xD он отказывается понимать что от него хотят ))) Вобще думаю вопрос решен, огромное вам спасибо за то что все таки помогли оптимизировать запрос, это самое главное! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 21:28:57 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
ms-dred, ну и шут с ним с этим запросом :-) работает --и ладно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 22:44:41 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
ms-dredMasterZiv, да нужны данные из таблицы w, поэтому первый вариант не подошел, а вот второй существенно снизил время выполнения, было от 0.2900 - 0.3544, стало 0.0522, при перезагрузки страницы показывает вобще 0.0200 и это очень радует. Ты в часах время указываешь или в сутках ? Если хотя бы в секундах, то, извини, вообще не понятно, что тебе надо. Это быстрые запросы. Я думал, у тебя там по несколько минут... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2013, 10:34:08 |
|
||
|
Помогите оптимизировать сложный запрос с 3 таблицами
|
|||
|---|---|---|---|
|
#18+
MasterZiv, у меня таких запросов на странице несколько, и если пользователей докера то мою ВПС могут положить на лопатки в любой момент, поэтому там где можно снизить время выполнения скрипта, это нужно делать! Это для меня жизненно необходимо. Конечно, если бы было только два - три этих запроса на весь сайт, то думаю даже и задумываться даже и не стоило бы =) А так существенно снизили скорость. К тому же мне на будущее будет это уроком, теперь примерно буду знать как оптимизировать запросы, еще конечно почитаю про все это. Спасибо вам ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2013, 03:59:14 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38397999&tid=1836021]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 369ms |

| 0 / 0 |
