powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация COUNT()
6 сообщений из 6, страница 1 из 1
Оптимизация COUNT()
    #39100220
BIS-10-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Заранее спасибо за любую помощь) помогите оптимизировать такой запрос. Отрабатывается секунда 5-6. Нужно быстрее
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT C.country_name, COUNT( I.id ) AS count
FROM section_items S, countries C, resource R, items I
WHERE S.section_id =6
AND I.id = S.item_id
AND R.resource_id = I.res_id
AND C.id = R.COUNTRY_ID
AND I.not_date <=  '2015-11-11'
GROUP BY C.country_name
ORDER BY count DESC


Таблца items - 8 млн записей:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE IF NOT EXISTS `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `log_id` int(11) NOT NULL,
  `res_id` int(11) NOT NULL,
  `link` varchar(255) NOT NULL,
  `title` text NOT NULL,
  `content` text NOT NULL,
  `n_date` varchar(255) NOT NULL,
  `nd_date` int(11) NOT NULL,
  `s_date` int(11) NOT NULL,
  `not_date` date NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `link_2` (`link`),
  KEY `log_id` (`log_id`),
  KEY `res_id` (`res_id`),
  KEY `now_date` (`not_date`),
  KEY `sql_index` (`res_id`,`id`,`not_date`)
) ENGINE=Aria  DEFAULT CHARSET=utf8 PAGE_CHECKSUM=0 AUTO_INCREMENT=9129638 ;


Таблица section_items - 700 тысяч
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE IF NOT EXISTS `section_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `section_id` int(11) NOT NULL,
  `item_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ix_phone` (`section_id`,`item_id`,`user_id`),
  KEY `user_id` (`user_id`),
  KEY `section_id` (`section_id`),
  KEY `item_index` (`item_id`),
  KEY `sql_index` (`user_id`,`section_id`,`item_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=630874 ;


В таблице RESOURCE поле COUNTRY_ID integer
...
Рейтинг: 0 / 0
Оптимизация COUNT()
    #39101195
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BIS-10-2,
у тебя нормальное время …
делал аналогичное для простого count, простой таблицы — 10 000 000 записей, все помещалось в память (проверялось по использованию памяти) — время 12 сек.
одно ядро из 3 грузилось на 100%
...
Рейтинг: 0 / 0
Оптимизация COUNT()
    #39101259
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BIS-10-2,

CREATE TABLE IF NOT EXISTS `items`
---ENGINE= Aria

переведите на InnoDB, есть шанс, что будет быстрее
и план запроса (EXPLAIN) покажите
...
Рейтинг: 0 / 0
Оптимизация COUNT()
    #39101300
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать вынести таблицу countries из группировки, а группировать по R.COUNTRY_ID
...
Рейтинг: 0 / 0
Оптимизация COUNT()
    #39101342
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BIS-10-2,

напрямую убыстрить врядли получится, надо заходить с флангов:

1. почему надо большая скорость на таком большом количестве записей?

2. сколько записей изменяется (добавляется, изменяется, удаляется) в секунду?

3. нужно ли имено реал-тайм?

если ответы на эти вопросы позволят, то можно:

1. Редко высчитать результат по стабильным записям и
быстро подсчитывать именившиеся записи с, допустим,
полуночи.

2. продолжить идею МикСофта в сторону денормализации
например
апстрим денормализация -- занести флаг hasSectionId_6 в таблицу Итем.
даунстрим денормализация -- занести CountryID из Ресурсов в Итем.

3. еше вариация идеи МикСофта -- сгрупировать сначала
по ResourceID только по джоинту Item+SectionItem
и лиш потом подцепить Ресорсы о КОнтри с повторной
гроуп бы. (результату первой группировки далее адрегировать SUM() )

4. Забить и заняться DWH с глубокой пре-агрегацией
(опятже, если реал-тайм не нужен)
...
Рейтинг: 0 / 0
Оптимизация COUNT()
    #39101343
BIS-10-2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,

id | select_type| table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | S | ref | ix_phone,section_id,item_index | ix_phone | 4 | const | 232390 | Using index; Using temporary; Using filesort
1 | SIMPLE | I | eq_ref | PRIMARY,res_id,now_date,sql_index | PRIMARY | 4 | imas.S.item_id | 1 | Using where
1 | SIMPLE | R | eq_ref | PRIMARY PRIMARY | 8 | imas.I.res_id | 1 | Using where
1 | SIMPLE | C | eq_ref | PRIMARY PRIMARY | 4 | imas.R.COUNTRY_ID | 1 |
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация COUNT()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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