powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Требуется помощь в оптимизации запроса
25 сообщений из 66, страница 1 из 3
Требуется помощь в оптимизации запроса
    #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
Требуется помощь в оптимизации запроса
    #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
Требуется помощь в оптимизации запроса
    #38766298
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправка:

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

индексы уже созданы, забыл указать это в теме
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38766353
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
okuznetsovиндексы уже созданыСорри, проглядел в плане.
На будущее - не надо постить картинки, лучше показывать результат SHOW CREATE TABLE.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #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
Требуется помощь в оптимизации запроса
    #38766377
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc1. напрашивается что бы category была
обязательная связка от game. Тогда
не нужно LEFT JOIN а просто JOIN.Без разницы в данном случае.
javajdbc2. добавить двоиной индекс (date,game_id)Для чего? не вижу от него пользы.
javajdbc3. переписать селект так:Я только не уверен, что поле `game`.id уникальное. К сожалению, нам этого не показали.
Но в целом с переписыванием согласен.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #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
Требуется помощь в оптимизации запроса
    #38766385
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

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

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


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

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

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

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

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

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

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

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

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

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


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