powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Time series база данных, медленные запросы
20 сообщений из 20, страница 1 из 1
Time series база данных, медленные запросы
    #39042822
fakofsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Я тут новенький, но перед тем как писать пользовался поиском и ничего похожего на мою проблему не нашел.

Есть 2 таблицы users и users_ratings, первая хранит ник и id юзера, во второй таблице хранятся рейтинги пользователя с временной меткой.
Пример с тестовыми данными можно скачать тут

Количество рейтингов может увеличиться со временем.
Тестовый запрос выбирает 100 пользователей с сортировкой по rating1, у которых, rating2 больше 1000
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT u.*
     , x.*
  FROM users u 
  JOIN users_ratings x
    ON x.user_id = u.id
  JOIN 
     ( SELECT user_id
            , MAX(created_date) maxdate 
         FROM users_ratings
        WHERE rating2 > 1000
        GROUP 
           BY user_id
     ) y 
    ON y.user_id = x.user_id 
   AND y.maxdate = x.created_date
 ORDER 
    BY x.rating1
 LIMIT 100;



Сделал UNIQUE ключик в users_ratings по полям (user_id,rating1,rating2,created_date) именно в таком порядке, ключик используется, но на реальной базе, где users содержит более 70к строк, а users_ratings уже больше 185к строк, запрос стал выполняться за 700мс, что уже недопустимо.
Данные по рейтингам могут добавляться в users_ratings очень часто. Т.е. если я, допутим, хочу получить 10 самых крутых по rating1 юзеров, можно результат запроса и в memcache закинуть, но обновлять после каждой записи в табилцу users_ratings для поддержания актуальности.
Взываю к помощи, может быть не ту СУБД выбрал, может со структурой ошибся?
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042845
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fakofskyВсем привет. Я тут новенький, но перед тем как писать пользовался поиском и ничего похожего на мою проблему не нашел.

Есть 2 таблицы users и users_ratings, первая хранит ник и id юзера, во второй таблице хранятся рейтинги пользователя с временной меткой.
Пример с тестовыми данными можно скачать тут

Количество рейтингов может увеличиться со временем.
Тестовый запрос выбирает 100 пользователей с сортировкой по rating1, у которых, rating2 больше 1000
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT u.*
     , x.*
  FROM users u 
  JOIN users_ratings x
    ON x.user_id = u.id
  JOIN 
     ( SELECT user_id
            , MAX(created_date) maxdate 
         FROM users_ratings
        WHERE rating2 > 1000
        GROUP 
           BY user_id
     ) y 
    ON y.user_id = x.user_id 
   AND y.maxdate = x.created_date
 ORDER 
    BY x.rating1
 LIMIT 100;



Сделал UNIQUE ключик в users_ratings по полям (user_id,rating1,rating2,created_date) именно в таком порядке, ключик используется, но на реальной базе, где users содержит более 70к строк, а users_ratings уже больше 185к строк, запрос стал выполняться за 700мс, что уже недопустимо.
?

У тебя неверные оценки допустимости.
Это хорошее время для такого запроса.
Быстрее не получится -- запрос не оптимизируем в принципе, у него нет даже поводов для этого.

fakofskyДанные по рейтингам могут добавляться в users_ratings очень часто. Т.е. если я, допутим, хочу получить 10 самых крутых по rating1 юзеров, можно результат запроса и в memcache закинуть, но обновлять после каждой записи в табилцу users_ratings для поддержания актуальности.
Взываю к помощи, может быть не ту СУБД выбрал, может со структурой ошибся?

Ошибся ты вообще всем.
Смена СУБД не поможет, структуры так же.

На кой хрен кому нужны 100 (!!!) самых крутых пользователей ?
Это список на получение нобелевской премии ? Тогда секунду-другую могут подождать, не развалятся.
Или это на главной надо светить ? Тогда кому нужно 100 ?

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

В общем, предвычисляй этот рейтинг периодически и показывай предвычисленный до следующего перещёта.

А ещё лучше -- выводи просто случайные 100 пользователей, всё равно никто не проверит. :-)
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042889
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fakofsky,

План запроса покажите.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042936
fakofsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, если я правильно понял вот это ?
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042942
fakofsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivА ещё лучше -- выводи просто случайные 100 пользователей, всё равно никто не проверит. :-)

Ну так то дело не пойдет, точно. Суть в том, что отображается список ссылок на страницы юзеров, на страницах юзеров куча инфы из которой считаются рейтинги и сами рейтинги, а точнее все это по сессиям. Последняя сессия будет соответствовать как раз той записи, которая выберется из users_ratings запросом выше. Так вот при переходе из списка, на странице рейтинг ведь не должен отличаться, а в случае кеширования, может возникнуть когнитивный!
Админ советует сделать рейд из 2 SSD по 300 ГБ и туда положить базу, мол на вырост хватит. Но я вижу именно экспоненциальный рост времени запроса, от количества записей.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042966
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fakofskymiksoft, если я правильно понял вот это ?Да. Продублирую тут для удобства.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042967
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что это поле user_id такое огромное? Покажите DDL таблицы целиком.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042970
fakofsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftА что это поле user_id такое огромное? Покажите DDL таблицы целиком.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `users_ratings` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `created_date` varchar(255) DEFAULT NULL,
  `user_id` mediumint(9) DEFAULT NULL,
  `rating1` mediumint(9) DEFAULT NULL,
  `rating2` mediumint(9) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_id` (`user_id`,`rating2`,`created_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042973
fakofsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `users_ratings` (
  `id` mediumint(8) unsigned NOT NULL,
  `created_date` varchar(255) DEFAULT NULL,
  `user_id` mediumint(9) DEFAULT NULL,
  `rating1` mediumint(9) DEFAULT NULL,
  `rating2` mediumint(9) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Если быть точным, и ключ в предыдущем сообщении не правильный, rating1 тоже в ключе. Не нашел как отредактировать сообщение!
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042982
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fakofskyMasterZivА ещё лучше -- выводи просто случайные 100 пользователей, всё равно никто не проверит. :-)

Ну так то дело не пойдет, точно. Суть в том, что отображается список ссылок на страницы юзеров, на страницах юзеров куча инфы из которой считаются рейтинги и сами рейтинги, а точнее все это по сессиям. Последняя сессия будет соответствовать как раз той записи, которая выберется из users_ratings запросом выше. Так вот при переходе из списка, на странице рейтинг ведь не должен отличаться, а в случае кеширования, может возникнуть когнитивный!
Админ советует сделать рейд из 2 SSD по 300 ГБ и туда положить базу, мол на вырост хватит. Но я вижу именно экспоненциальный рост времени запроса, от количества записей.

Не, не хватит. Потому что рост квадратичный от числа оценок.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042987
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПотому что рост квадратичный от числа оценок.При наличии индексов вроде N*log(N) получется. Что, впрочем, тоже хуже, чем линейно.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042993
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать зайти с другой стороны:
Код: sql
1.
2.
3.
4.
SELECT u.*
     , (SELECT rating1 FROM users_ratings ur WHERE ur.user_id=u.id ORDER BY ur.created_date DESC LIMIT 1) rating1
 ORDER BY rating1
 LIMIT 100;

Понадобится индекс (user_id,created_date) на таблице users_ratings.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042996
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fakofskyАдмин советует сделать рейд из 2 SSD по 300 ГБ и туда положить базу, мол на вырост хватит.Если идти таким путем, то я бы предложил tmpfs в памяти сделать. А то и всю базу в оперативку положить.
И, уж как минимум, дать достаточно памяти для кэша InnoDB.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39042998
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fakofsky
Код: plsql
1.
`created_date` varchar(255)

Это зачем такой ужас? Почему не использовать специальные типы?
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39043000
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fakofsky
Код: plsql
1.
ENGINE=MyISAM

А что на InnoDB не переведете?
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39043200
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftMasterZivПотому что рост квадратичный от числа оценок.При наличии индексов вроде N*log(N) получется. Что, впрочем, тоже хуже, чем линейно.

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

Но линейный рост -- это УЖЕ ПЛОХО. надо логарифмический, чтобы это работало.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39043201
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftfakofsky
Код: plsql
1.
ENGINE=MyISAM

А что на InnoDB не переведете?

Очень правильно обозначаешь приоритеты дальнейшего развития этого дела.
И с типом "даты" тоже.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39043277
fakofsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Объясните, почему InnoDB?
я знаю что MyISAM имеет смысл использовать, когда преобладают операции insert или select, но крайне мало delete или update.
Может быть я чего-то не понимаю, но select и insert у меня действительно больше.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39043305
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot fakofsky]MasterZiv,

Объясните, почему InnoDB?

Потому что MyISAM - это полное говно. MySql становится СУБД только когда начинаешь использовать Innodb.
конкретно для тебя инно даст возможность кэшировать данные , чего MyISAM не умеет в принципе.


я знаю что MyISAM имеет смысл использовать, когда преобладают операции insert или select, но крайне мало delete или update.
Может быть я чего-то не понимаю, но select и insert у меня действительно больше.

ты знаешь неправильно.
...
Рейтинг: 0 / 0
Time series база данных, медленные запросы
    #39044780
fakofsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо. Решением стало разделение данных на 2 части, есть таблица users_ratings, в ней последние рейтинги пользователей, т.е. по 1 записи на юзера. И есть таблица users_ratings_history, вот тут и хранятся все изменения. Теперь чтобы получить топ, исползуем обычный order by, без всяких подзапросов.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Time series база данных, медленные запросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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