powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Требуется помощь в оптимизации запроса
25 сообщений из 66, страница 2 из 3
Требуется помощь в оптимизации запроса
    #38767208
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
okuznetsovВ результате получились два запросамне кажется или это один и тот же запрос, только с изменённым порядком таблиц в джойне?
okuznetsov 1) Также хотелось бы узнать можно ли что-то сделать и с этим запросом: Скорее всего нет. Ордер бай ранд() работает дубово: выбирается всё, подходящее под условие, для каждой записи генерируется рандом, результат сортируется. Учитывая, что сортировать надо практически всю таблицу (если ид у вас - ПК), то сортировка запросто может задействовать диск. Превед производительность.

А запросы к инфо_схема и не обязаны быть быстрыми. Неужели вам требуется выполнять их N раз в секунду?
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767400
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirokuznetsovВ результате получились два запросамне кажется или это один и тот же запрос, только с изменённым порядком таблиц в джойне?
okuznetsov 1) Также хотелось бы узнать можно ли что-то сделать и с этим запросом: Скорее всего нет. Ордер бай ранд() работает дубово: выбирается всё, подходящее под условие, для каждой записи генерируется рандом, результат сортируется. Учитывая, что сортировать надо практически всю таблицу (если ид у вас - ПК), то сортировка запросто может задействовать диск. Превед производительность.

А запросы к инфо_схема и не обязаны быть быстрыми. Неужели вам требуется выполнять их N раз в секунду?

1) Именно так, один и тот же запрос, оформленный по разному. вроде бы по скорости одинаково выполняются. по стилю написания, т.е. хорошему тону какой соответствует?

2) а я думаю, что вариантом много как можно сделать, вплоть до тригеров и хранимых процедур. По поводу производительности, я в курсе, данный запрос создаёт существенную нагрузку на двухядерный процессор при большом числе пользователей на сайте, поэтому и занимаюсь его улучшением.

Меня устраивает и следующий вариант реализации. Если вот таким образом сделать - это хорошее решение?

авторSELECT *
FROM game AS r1
JOIN
(
SELECT (RAND() * (SELECT MAX(id) FROM game)) AS id
) AS r2
WHERE r1.id >= r2.id
#ORDER BY r1.id ASC
LIMIT 15;
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767401
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Расшифровка (на всякий случай):

JOIN добавляет все ID который больше или равны нашему случайному значению и мы выбираем ближайшего соседа, если равенство не возможно. НО как только 15 строк найдено мы останавливаемся.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767405
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
okuznetsovРасшифровка (на всякий случай):

JOIN добавляет все ID который больше или равны нашему случайному значению и мы выбираем ближайшего соседа, если равенство не возможно. НО как только 15 строк найдено мы останавливаемся.


идея хорошая, реализация нет.
Поробуйте шаг за шагом:

1. заполучить максимально значение ИД
Код: sql
1.
select max(id) maxid from games



2. размножить сие значение 20 раз (с небольшим запасом на случайные повторения)

Код: sql
1.
2.
3.
4.
5.
select maxid
from 
(select max(id) maxid from games) z1
join (select 1 a union select 2 union select 3 union select 4 union select 5) z2
join (select 1 a union select 2 union select 3 union select 4) z3



3. помножить на РАНД

Код: sql
1.
2.
3.
4.
5.
select rand()*maxid
from 
(select max(id) maxid from games) z1
join (select 1 a union select 2 union select 3 union select 4 union select 5) z2
join (select 1 a union select 2 union select 3 union select 4) z3



4. выбрать наиближайшего реального соседа, допустим снизу

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select 
(
  select id 
  from games 
  where id <= rand()*maxid 
  order by id desc 
  limit 1
) rand_real_id
from 
(select max(id) maxid from games) z1
join (select 1 a union select 2 union select 3 union select 4 union select 5) z2
join (select 1 a union select 2 union select 3 union select 4) z3



5 и выташить все поля нужных записей, снова отсортировать по ранд()
и взять 15 случайных значений

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select g.*
from  
(
select 
(
  select id 
  from games 
  where id <= rand()*maxid 
  order by id desc 
  limit 1
) rand_real_id
from 
(select max(id) maxid from games) z1
join (select 1 a union select 2 union select 3 union select 4 union select 5) z2
join (select 1 a union select 2 union select 3 union select 4) z3
) z4
join games g on g.id = z4.rand_real_id 
order by rand()
limit 15
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767408
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чём плохая реализация заключается? По времени на моей таблице в 7 000 000 строк запрос стал выполняться достаточно быстро - в пределах от 0.040 - 0.080 сек, на порядок ускорился.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767409
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант предложенный вами сейчас тоже изучу
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767412
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
okuznetsovА в чём плохая реализация заключается? По времени на моей таблице в 7 000 000 строк запрос стал выполняться достаточно быстро - в пределах от 0.040 - 0.080 сек, на порядок ускорился.

Ваш вариант выбирате 15 ид подряд начиная
с некоторого случайного числа.
Если это и есть ваше определение 15 случайных ИД --
то ок.

Мой варинат -- 15 реально случайно разбросаных ид
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767416
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcokuznetsovА в чём плохая реализация заключается? По времени на моей таблице в 7 000 000 строк запрос стал выполняться достаточно быстро - в пределах от 0.040 - 0.080 сек, на порядок ускорился.

Ваш вариант выбирате 15 ид подряд начиная
с некоторого случайного числа.
Если это и есть ваше определение 15 случайных ИД --
то ок.

Мой варинат -- 15 реально случайно разбросаных ид

Ваш вариант заинтересовал меня своим решением, и я попробовал потестировал его, в результате заметил одну не очень хорошую закономерность - случайные ИД генерируются в достаточно приближённом районе от максимального ID и ни как не из середины таблицы и тем более её начала. Возможно это какое-то странное совпадение, но я запускал запрос на выполнение подряд несколько сотен раз и интервалом в среднем 0.5 секунды.

В принципе меня устраивает и мой вариант, он хорош для меня как раз тем, что вытаскиваются подряд случайно рядом стоящие ИД, т.к. это есть одинаковые игры разных версий, а также похожие на рядом стоящие игры. Я так понял пока разбирался, что игры добавлялись в таблицу друг за дружкой сгруппированные по интересам и жанрам.

Если с моим запросом всё в порядке тогда беру его)
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767418
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcokuznetsovА в чём плохая реализация заключается? По времени на моей таблице в 7 000 000 строк запрос стал выполняться достаточно быстро - в пределах от 0.040 - 0.080 сек, на порядок ускорился.

Ваш вариант выбирате 15 ид подряд начиная
с некоторого случайного числа.
Если это и есть ваше определение 15 случайных ИД --
то ок.

Мой варинат -- 15 реально случайно разбросаных ид



Можете помочь мне вот с этим запросом разобраться? Я не знаю и не понимаю пока для чего и зачем он нужен, но он в моём списке медленных запросов mysql-slow.log:

2) И хотелось бы что-то сделать с запросом такого плана (primary key соответственно в данной таблице нет):


авторselect ifnull(sum(data_length + index_length), 0) from information_schema.tables where table_schema = 'dbgwg';



выполняется в среднем около 0.5 сек в среднем бывают моменты когда более 1 секунды

EXPLAIN EXTENDED следующий:

1 SIMPLE tables ALL TABLE_SCHEMA Using where; Open_full_table; Scanned 1 database
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767463
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
okuznetsovЯ не знаю и не понимаю пока для чего и зачем он нуженСчитает размер таблиц в схеме 'dbgwg'. По идее, чисто админская операция.
okuznetsovв результате заметил одну не очень хорошую закономерность - случайные ИД генерируются в достаточно приближённом районе от максимального ID+1
Как-то странно ранд работает. Ради интереса покрутил на одной из своих таблиц. Макс. ид = 20000 (впрочем, реально там идшники только до 15000), есть пропуски.
Код: sql
1.
2.
3.
4.
5.
select id,qwe,id<=qwe from (
  select id,rand()*20000 qwe
  from ls 
  having id <= qwe
  order by id desc ) t1 order by 1 desc

Так первой же строкой вылезаетidqweid<=qwe148164915.748075503620Это вообще *** как? если хэвингом эта строка должна была отсеяться в любом случае?? Впрочем, я проверял на старой версии - может, это какой-то известный баг и ТСу надо просто обновиться?

Впрочем, если вычисление ранда вынести в "статику", то работает нормально:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select 
(
  select id 
  from games
  where id <= rand_ceil
  order by id desc 
  limit 1
) rand_real_id
from (
 select maxid*rand() as rand_ceil from 
 (select max(num) maxid from ls) z1
 join (select 1 a union select 2 union select 3 union select 4 union select 5) z2
 join (select 1 a union select 2 union select 3 union select 4) z3
) z4
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767599
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поправленный вами вариант, заработал, вижу стали генерироваться разные ИД, но скорость выполнения запроса упала в разы, на моей таблице составляет от 0.5 - 1 сек, это много. в том варианте который у javajdbc и менят- запрос выполняется от 0.040-0.100 сек.

спасибо за объяснение "Считает размер таблиц в схеме 'dbgwg'. По идее, чисто админская операция."
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767625
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
okuznetsovно скорость выполнения запроса упала в разычудеса, да и только
а если по отдельности кусочки позапускать? даже не представляю, что именно там тормозить может...
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767627
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вы несколько раз проверяли? у меня стабильно за 0,05с отрабатывает, только первый запуск был 0,2с.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767686
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirКстати, вы несколько раз проверяли? у меня стабильно за 0,05с отрабатывает, только первый запуск был 0,2с.

по отдельности быстро работают, каждый выполняется не более чем за 0.040 секунд.

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

лучше на ютьюбе посмотрите, перейдите по прямой ссылке _
YouTube Video
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767693
okuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
okuznetsov,
курсор мышки нужно было просто убрать:) и не чего не отрезалось бы:) заработался)
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767756
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
okuznetsov, мда, хрень какая-то... сейчас проверил на тестовой таблице с 1М записей - по 5 секунд на запрос. В то же время если его превратить в
Код: sql
1.
2.
3.
4.
5.
select 
(select id from table where id <= 4 order by id desc limit 1) q1
,(select id from table where id <= 950909 order by id desc limit 1) q2
<...>
,(select id from table where id <= 976075 order by id desc limit 1) q20

или даже на такое (можно сказать, вообще тот же запрос, только "в лоб" написанный)
Код: sql
1.
2.
3.
4.
          select (select id from table where id <= 258493 order by id desc limit 1)
union all select (select id from table where id <= 978452 order by id desc limit 1)
<...>
union all select (select id from table where id <= 258741 order by id desc limit 1)

, то есть вручную подставить вычисленные границы в запрос, то выполняется моментально. WTF?
Грешил на рандом, но попробовал вообще вытащить эти 20 идшников во временную таблицу - один хрен. "В лоб" работает, а обход "опорной" таблицы с 20 записями тупит беспощадно...
Под спойлером - код. У кого есть мысли?
Код: 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.
-- тестовая таблица, наполнена 1М записей
CREATE TABLE `tbl` (
	`id` INT(10) UNSIGNED NOT NULL,
	`oname` VARCHAR(50) NOT NULL DEFAULT '',
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

-- темп таблица для идшников; впрочем, и с инлайном всё то же самое
drop temporary table if exists qwe;
create temporary table qwe (id_ceil int);
insert into qwe 
  select ceil(maxid*rand()) 
  from (select max(id) maxid from tbl) z1
  join (select 1 a union select 2 union select 3 union select 4 union select 5) z2
  join (select 1 a union select 2 union select 3 union select 4) z3;

-- запрос
select qwe.id_ceil,
(
  select id
  from tbl
  where id <= qwe.id_ceil
  order by id desc limit 1
) rand_real_id
from qwe

Эксплейн. Вариант с темптаблицей хорош отсутствием кучи юнионовских строк.
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYqweALL\N\N\N\N202DEPENDENT SUBQUERYtblindexPRIMARYPRIMARY4\N1118990Using where, Using index


время выполнения стабильно около 4.7 секунд.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767772
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда. Тупо запустил 20 запросов по отдельности.
Код: plaintext
/* Affected rows: 0  Found rows: 20  Warnings: 0   Duration for 20 queries: 0,000 sec.  */
ЯННП.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767781
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,

В порядке танцев с бубном - сделайте ANALYZE TABLE обеим таблицам.
Какой движок получился у таблицы qwe?
Что-нибудь изменится, если id <= qwe.id_ceil заменить на id < qwe.id_ceil ?
Что-нибудь изменится, если создать индекс qwe (id_ceil) ?
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767784
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более того.
Код: sql
1.
select rand()*max(id) q from tbl

- 0,81сек. Стабильно.
Код: sql
1.
select rand()*(select max(id) from tbl) q

- 0сек. Стабильно.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767789
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirБолее того.
Код: sql
1.
select rand()*max(id) q from tbl


- 0,81сек. Стабильно.
Код: sql
1.
select rand()*(select max(id) from tbl) q


- 0сек. Стабильно.
Эпичненько...
Планы?
Точная версия MySQL ?
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767793
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВ порядке танцев с бубном - сделайте ANALYZE TABLE обеим таблицамдык это я первым делом после наполнения сделал
miksoftКакой движок получился у таблицы qwe?инно
miksoftЧто-нибудь изменится, если id <= qwe.id_ceil заменить на id < qwe.id_ceil ?нет
miksoftЧто-нибудь изменится, если создать индекс qwe (id_ceil) ?Ну, в первой строке эксплейна появился "using index", а толку. Время то же.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767804
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЭпичненько...
Планы?
Точная версия MySQL ?
Код: sql
1.
select rand()*max(id) q from tbl

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEtblindex\NPRIMARY4\N1118990Using index
Код: sql
1.
select rand()*(select max(id) from tbl) q

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARY\N\N\N\N\N\N\NNo tables used2SUBQUERY\N\N\N\N\N\N\NSelect tables optimized away

5.0.67-community-nt-log
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767806
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir5.0.67Хм... а ежели посвежее взять?

Похоже, что недотумкивает оптимизатор, что в случае rand()*max(id) тоже можно Select tables optimized away.
...
Рейтинг: 0 / 0
Требуется помощь в оптимизации запроса
    #38767809
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftа ежели посвежее взять?склфидл лежит, а то я бы уже проверил на "посвежее"
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 2 из 3
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Требуется помощь в оптимизации запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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