Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Требуется помощь в оптимизации запроса / 25 сообщений из 66, страница 1 из 3
03.10.2014, 15:58:27
    #38766285
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
Исходный запрос требующийся оптимизировать:

автор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:
...
Рейтинг: 0 / 0
03.10.2014, 16:00:36
    #38766292
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
Код: 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.
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

Переформатировал запрос для большей читабельности
...
Рейтинг: 0 / 0
03.10.2014, 16:02:37
    #38766298
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
Поправка:

В таблице game_views хранится: 6998873 строк
В таблице game хранится: 80000 строк
Тип всех таблиц: InnoDB
...
Рейтинг: 0 / 0
03.10.2014, 16:03:30
    #38766301
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoft, спасибо)
...
Рейтинг: 0 / 0
03.10.2014, 16:04:17
    #38766303
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
Я бы попробовал создать индекс по полю `game_views`.`date`.
...
Рейтинг: 0 / 0
03.10.2014, 16:36:26
    #38766348
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoft,

индексы уже созданы, забыл указать это в теме
...
Рейтинг: 0 / 0
03.10.2014, 16:38:46
    #38766353
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
okuznetsovиндексы уже созданыСорри, проглядел в плане.
На будущее - не надо постить картинки, лучше показывать результат SHOW CREATE TABLE.
...
Рейтинг: 0 / 0
03.10.2014, 16:40:56
    #38766361
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
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.
SELECT *
FROM
(
SELECT
game_views.gaim_id
count(game_views.id) AS gv_cnt
FROM  `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
) t1
JOIN game ON ..............
JOIN category ON ............
...
Рейтинг: 0 / 0
03.10.2014, 16:45:57
    #38766377
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
javajdbc1. напрашивается что бы category была
обязательная связка от game. Тогда
не нужно LEFT JOIN а просто JOIN.Без разницы в данном случае.
javajdbc2. добавить двоиной индекс (date,game_id)Для чего? не вижу от него пользы.
javajdbc3. переписать селект так:Я только не уверен, что поле `game`.id уникальное. К сожалению, нам этого не показали.
Но в целом с переписыванием согласен.
...
Рейтинг: 0 / 0
03.10.2014, 16:46:24
    #38766380
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
в типографии ошиблись,
следует читать:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT *
FROM
(
SELECT
game_views.gaim_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
) t1
JOIN game ON ..............
JOIN category ON ............
...
Рейтинг: 0 / 0
03.10.2014, 16:49:38
    #38766385
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoft,

ок
...
Рейтинг: 0 / 0
03.10.2014, 16:50:17
    #38766389
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
javajdbcв типографии ошиблись,Еще в типографии остальные поля из game_views пропустили.
...
Рейтинг: 0 / 0
03.10.2014, 16:51:31
    #38766392
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoft
Код: sql
1.
t4_c3

Не завидую я тому, кто это отлаживать будет.
...
Рейтинг: 0 / 0
03.10.2014, 16:52:42
    #38766396
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoftjavajdbc1. напрашивается что бы category была
обязательная связка от game. Тогда
не нужно LEFT JOIN а просто JOIN.Без разницы в данном случае.
javajdbc2. добавить двоиной индекс (date,game_id)Для чего? не вижу от него пользы.
javajdbc3. переписать селект так:Я только не уверен, что поле `game`.id уникальное. К сожалению, нам этого не показали.
Но в целом с переписыванием согласен.


1. игра без категории -- некузяво звучит с точки зрения задачи

2. там фильтр по дате а групировка по гайм_ид --
чёрт его знает , а вдруг поможет двойной индекс?

3. гейм_ид не уникальный в таблице гейм?
Ну это будет некузявая некузявость...
...
Рейтинг: 0 / 0
03.10.2014, 16:56:04
    #38766410
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoft,

Разумеется, все поля id во всех 3-х таблицах -> primary key и autoincrement
...
Рейтинг: 0 / 0
03.10.2014, 16:58:01
    #38766416
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoft,

сделал кто то до меня и до того кто был до меня)
...
Рейтинг: 0 / 0
03.10.2014, 16:58:24
    #38766420
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
javajdbc,

спасибо, сейчас попробую
...
Рейтинг: 0 / 0
03.10.2014, 17:00:27
    #38766427
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoftjavajdbcв типографии ошиблись,Еще в типографии остальные поля из game_views пропустили.

Где Яростный Меч и ScareCrow когда в селекте есть поля
НЕ из Гроуп БУ ?
Почему я должен выполнять их работу?
:-)

у ТС -- неверный изначальный селект -- поля из gaim_view
не агрегированы.
...
Рейтинг: 0 / 0
03.10.2014, 17:06:44
    #38766443
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
javajdbcГде Яростный Меч и ScareCrow когда в селекте есть поля
НЕ из Гроуп БУ ?
Почему я должен выполнять их работу?
:-)Это наш коллективный сизифов камень :)
...
Рейтинг: 0 / 0
03.10.2014, 17:08:09
    #38766445
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
javajdbcу ТС -- неверный изначальный селект -- поля из gaim_view
не агрегированы.Ну значит ему все равно, что там выйдет.
...
Рейтинг: 0 / 0
03.10.2014, 17:32:35
    #38766493
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
miksoftjavajdbcу ТС -- неверный изначальный селект -- поля из gaim_view
не агрегированы.Ну значит ему все равно, что там выйдет.

я понял, что не верный поэтому помощи прошу, иначе бы у меня всё работало и к вам не обратился бы
...
Рейтинг: 0 / 0
03.10.2014, 17:35:15
    #38766494
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
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
...
Рейтинг: 0 / 0
03.10.2014, 17:36:44
    #38766498
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
okuznetsov,

запятую забыли на предыдущей строчке
...
Рейтинг: 0 / 0
04.10.2014, 23:22:07
    #38767081
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
javajdbcв типографии ошиблись,
следует читать:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT *
FROM
(
SELECT
game_views.gaim_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
) t1
JOIN game ON ..............
JOIN category ON ............




В процессе изучения запроса выяснилось, что группировка по left join не нужна, т.е. категория для игры ни где не задействуется, поэтому не нужна в запросе. В результате получились два запроса, вроде бы оба одинаково правильных. Хотелось бы чтобы вы порекомендовали какой из них более правильный (может быть с точки зрения качественного стиля написания или рассчитанный на обработку при росте в будущем нагрузки)?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT *
FROM
(
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
) t1
JOIN game ON (game.id=`t1`.`game_id`)


или


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`)
...
Рейтинг: 0 / 0
05.10.2014, 02:46:23
    #38767111
okuznetsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Требуется помощь в оптимизации запроса
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>
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Требуется помощь в оптимизации запроса / 25 сообщений из 66, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]