|
|
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Исходный запрос требующийся оптимизировать: авторSELECT t.id AS t0_c0, t.catid AS t0_c1, t.title AS t0_c2, t.object AS t0_c3, t.description AS t0_c4, t.image AS t0_c5, t.votes_summ AS t0_c6, t.votes_count AS t0_c7, t.views AS t0_c8, t.favorites AS t0_c9, t.date AS t0_c10, t.is_uniq AS t0_c11, count(game_views.id) AS gv_cnt, category.id AS t1_c0, category.slug AS t1_c1, category.title AS t1_c2, category.description AS t1_c3, category.meta_title AS t1_c4, category.parent AS t1_c5, category.total_views AS t1_c6, game_views.id AS t4_c0, game_views.game_id AS t4_c1, game_views.date AS t4_c2, game_views.user_id AS t4_c3 FROM `game` `t` LEFT OUTER JOIN `category` `category` ON (`t`.`catid`=`category`.`id`) INNER JOIN `game_views` `game_views` ON (`game_views`.`game_id`=`t`.`id`) WHERE (`game_views`.`date` > DATE(NOW() - INTERVAL 7 DAY)) GROUP BY game_views.game_id ORDER BY gv_cnt DESC LIMIT 28 OFFSET 224 Скорость выполнения запроса (в среднем): 5 сек. В таблице хранится: 6998873 строк Тип таблицы: InnoDB Скриншоты EXPLAIN EXTENDED SELECT.... и SHOW WARNINGS: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 15:58:27 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Код: 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. Переформатировал запрос для большей читабельности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:00:36 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Поправка: В таблице game_views хранится: 6998873 строк В таблице game хранится: 80000 строк Тип всех таблиц: InnoDB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:02:37 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft, спасибо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:03:30 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Я бы попробовал создать индекс по полю `game_views`.`date`. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:04:17 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft, индексы уже созданы, забыл указать это в теме ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:36:26 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovиндексы уже созданыСорри, проглядел в плане. На будущее - не надо постить картинки, лучше показывать результат SHOW CREATE TABLE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:38:46 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
1. напрашивается что бы category была обязательная связка от game. Тогда не нужно LEFT JOIN а просто JOIN. 2. добавить двоиной индекс (date,game_id) 3. переписать селект так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:40:56 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
javajdbc1. напрашивается что бы category была обязательная связка от game. Тогда не нужно LEFT JOIN а просто JOIN.Без разницы в данном случае. javajdbc2. добавить двоиной индекс (date,game_id)Для чего? не вижу от него пользы. javajdbc3. переписать селект так:Я только не уверен, что поле `game`.id уникальное. К сожалению, нам этого не показали. Но в целом с переписыванием согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:45:57 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
в типографии ошиблись, следует читать: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:46:24 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft, ок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:49:38 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
javajdbcв типографии ошиблись,Еще в типографии остальные поля из game_views пропустили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:50:17 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft Код: sql 1. Не завидую я тому, кто это отлаживать будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:51:31 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoftjavajdbc1. напрашивается что бы category была обязательная связка от game. Тогда не нужно LEFT JOIN а просто JOIN.Без разницы в данном случае. javajdbc2. добавить двоиной индекс (date,game_id)Для чего? не вижу от него пользы. javajdbc3. переписать селект так:Я только не уверен, что поле `game`.id уникальное. К сожалению, нам этого не показали. Но в целом с переписыванием согласен. 1. игра без категории -- некузяво звучит с точки зрения задачи 2. там фильтр по дате а групировка по гайм_ид -- чёрт его знает , а вдруг поможет двойной индекс? 3. гейм_ид не уникальный в таблице гейм? Ну это будет некузявая некузявость... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:52:42 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft, Разумеется, все поля id во всех 3-х таблицах -> primary key и autoincrement ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:56:04 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft, сделал кто то до меня и до того кто был до меня) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:58:01 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
javajdbc, спасибо, сейчас попробую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 16:58:24 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoftjavajdbcв типографии ошиблись,Еще в типографии остальные поля из game_views пропустили. Где Яростный Меч и ScareCrow когда в селекте есть поля НЕ из Гроуп БУ ? Почему я должен выполнять их работу? :-) у ТС -- неверный изначальный селект -- поля из gaim_view не агрегированы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 17:00:27 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
javajdbcГде Яростный Меч и ScareCrow когда в селекте есть поля НЕ из Гроуп БУ ? Почему я должен выполнять их работу? :-)Это наш коллективный сизифов камень :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 17:06:44 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
javajdbcу ТС -- неверный изначальный селект -- поля из gaim_view не агрегированы.Ну значит ему все равно, что там выйдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 17:08:09 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoftjavajdbcу ТС -- неверный изначальный селект -- поля из gaim_view не агрегированы.Ну значит ему все равно, что там выйдет. я понял, что не верный поэтому помощи прошу, иначе бы у меня всё работало и к вам не обратился бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 17:32:35 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
javajdbcmiksoftпропущено... Еще в типографии остальные поля из game_views пропустили. Где Яростный Меч и ScareCrow когда в селекте есть поля НЕ из Гроуп БУ ? Почему я должен выполнять их работу? :-) у ТС -- неверный изначальный селект -- поля из gaim_view не агрегированы. Получаю ошибку в этой части запроса, не пойму как поправить: SELECT game_views.game_id count(game_views.id) AS gv_cnt FROM `game_views` `game_views` WHERE (`game_views`.`date` > DATE(NOW() - INTERVAL 7 DAY)) GROUP BY game_views.game_id ORDER BY gv_cnt DESC LIMIT 28 OFFSET 224 [Err] 1064 - 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 'count(game_views.id) AS gv_cnt FROM `game_views` `game_views` WHERE (`game_v' at line 3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 17:35:15 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsov, запятую забыли на предыдущей строчке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 17:36:44 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
javajdbcв типографии ошиблись, следует читать: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. В процессе изучения запроса выяснилось, что группировка по left join не нужна, т.е. категория для игры ни где не задействуется, поэтому не нужна в запросе. В результате получились два запроса, вроде бы оба одинаково правильных. Хотелось бы чтобы вы порекомендовали какой из них более правильный (может быть с точки зрения качественного стиля написания или рассчитанный на обработку при росте в будущем нагрузки)? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. или SELECT * FROM `game` `game` JOIN ( SELECT game_views.game_id, count(game_views.id) AS gv_cnt FROM `game_views` `game_views` WHERE (`game_views`.`date` > DATE(NOW() - INTERVAL 7 DAY)) GROUP BY game_views.game_id ORDER BY gv_cnt DESC LIMIT 28 OFFSET 224 ) as t1 ON (`game`.`id`=`t1`.`game_id`) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2014, 23:22:07 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
1) Также хотелось бы узнать можно ли что-то сделать и с этим запросом: <pre class="src lang-sql"> SELECT * FROM `game` `t` WHERE t.id <> 208405 ORDER BY rand() LIMIT 15; </pre> выполняется в среднем от 0.5 - 1 сек, но бывают моменты когда более 3 секунд EXPLAIN EXTENDED: 1 SIMPLE t range PRIMARY PRIMARY 4 49391 100,00 Using where; Using temporary; Using filesort 2) И хотелось бы что-то сделать с запросом такого плана (primary key соответственно в данной таблице нет): <pre class="src lang-sql"> select ifnull(sum(data_length + index_length), 0) from information_schema.tables where table_schema = 'dbgwg'; </pre> выполняется в среднем около 0.5 сек в среднем бывают моменты когда более 1 секунды EXPLAIN EXTENDED следующий: 1 SIMPLE tables ALL TABLE_SCHEMA Using where; Open_full_table; Scanned 1 database 1) SHOW CREATE TABLE game <pre class="src lang-sql"> CREATE TABLE `game` ( `id` int(11) NOT NULL AUTO_INCREMENT, `catid` int(11) NOT NULL, `title` varchar(255) CHARACTER SET utf8 NOT NULL, `object` text CHARACTER SET utf8 NOT NULL, `description` text CHARACTER SET utf8 NOT NULL, `image` varchar(255) NOT NULL, `votes_summ` int(11) NOT NULL, `votes_count` int(11) NOT NULL, `views` int(11) NOT NULL, `favorites` int(11) NOT NULL, `date` datetime NOT NULL, `is_uniq` tinyint(1) NOT NULL, PRIMARY KEY (`id`), KEY `catid` (`catid`), KEY `date` (`date`), KEY `favorites` (`favorites`), KEY `views` (`views`), KEY `title` (`title`), KEY `votes_summ` (`votes_summ`,`votes_count`), KEY `is_uniq` (`is_uniq`) ) ENGINE=InnoDB AUTO_INCREMENT=268052 DEFAULT CHARSET=latin1 </pre> 2) SHOW CREATE TABLE tables <pre class="src lang-sql">CREATE TEMPORARY TABLE `TABLES` ( `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '', `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '', `TABLE_NAME` varchar(64) NOT NULL DEFAULT '', `TABLE_TYPE` varchar(64) NOT NULL DEFAULT '', `ENGINE` varchar(64) DEFAULT NULL, `VERSION` bigint(21) unsigned DEFAULT NULL, `ROW_FORMAT` varchar(10) DEFAULT NULL, `TABLE_ROWS` bigint(21) unsigned DEFAULT NULL, `AVG_ROW_LENGTH` bigint(21) unsigned DEFAULT NULL, `DATA_LENGTH` bigint(21) unsigned DEFAULT NULL, `MAX_DATA_LENGTH` bigint(21) unsigned DEFAULT NULL, `INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL, `DATA_FREE` bigint(21) unsigned DEFAULT NULL, `AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL, `CREATE_TIME` datetime DEFAULT NULL, `UPDATE_TIME` datetime DEFAULT NULL, `CHECK_TIME` datetime DEFAULT NULL, `TABLE_COLLATION` varchar(32) DEFAULT NULL, `CHECKSUM` bigint(21) unsigned DEFAULT NULL, `CREATE_OPTIONS` varchar(255) DEFAULT NULL, `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT '' ) ENGINE=MEMORY DEFAULT CHARSET=utf8</pre> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2014, 02:46:23 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38766498&tid=1832936]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 397ms |

| 0 / 0 |
