SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.03.2013 10:39:06

krevedko13
Участник
Зарегистрирован: 19.12.2010
Сообщений: 20

Выборка из больших таблиц - биллинг из логов squid

Код:

CREATE TABLE IF NOT EXISTS `actions` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `userId` int(10) unsigned NOT NULL,
  `site` varchar(255) NOT NULL,
  `date` int(10) unsigned NOT NULL,
  `traffic` bigint(20) unsigned NOT NULL,
  `userIp` int(10) unsigned NOT NULL,
  `cached` enum('yes','no') NOT NULL,
  `rawLogString` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`,`userId`),
  KEY `userId` (`userId`),
  KEY `date` (`date`),
  KEY `site` (`site`),
  KEY `userId_2` (`userId`,`date`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `groups_advanced` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `tariffId` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `domain` varchar(255) NOT NULL,
  `fullname` varchar(255) NOT NULL,
  `mainGroupId` int(10) unsigned NOT NULL,
  `advancedGroupId` int(10) unsigned NOT NULL,
  `tariffId` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `mainGroupId` (`mainGroupId`,`advancedGroupId`),
  KEY `username` (`username`),
  KEY `fullname` (`fullname`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

users - пользователи (сотни)
groups_advanced - подразделения фирмы (десятки)
actions - логи сквида (десятки миллионов)

Суть: выбираем пачку пользователей по advancedGroupId (скажем штук 50 - сотрудники подразделения), затем считаем их трафик за месяц

Код:

SELECT SUM(act.traffic) AS traffic, act.userId FROM `actions` `act` WHERE ((act.date >= 1362081601 AND act.date <= 1364759999) AND (act.cached = "no")) AND (act.userId IN ( 1, 2, 3, 4 ..... 49, 50 )) GROUP BY userId

Вот этот самый запрос выполняется дико долго - на 10 пользователях порядка 5-7 секунд, на 600 пользователях - не дождался.

Прошу помощи - в какую сторону копать оптимизацию ? Индексы править или думать над разбиением actions на группу таблиц по каким-либо признакам ?

Конфиг

Код:

key_buffer_size=256M
max_connections=128
low_priority_updates=1
old_passwords=0
read_buffer_size=32M
read_rnd_buffer_size = 4M
sort_buffer_size=32M
query_cache_type=0
query_cache_limit=1M
query_cache_min_res_unit=1K
query_cache_size=16M
table_cache=1000
table_open_cache=256
thread_cache_size=128
tmp_table_size=64M
max_heap_table_size=128M
max_allowed_packet=1M
max_length_for_sort_data=1024
myisam_sort_buffer_size=64M
thread_concurrency=8

innodb_data_home_dir=/var/lib/mysql
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_group_home_dir=/var/lib/mysql
innodb_buffer_pool_size=2048M
innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT
innodb_log_buffer_size=4M
innodb_log_file_size=256M
innodb_file_per_table=1
innodb_lock_wait_timeout=50
innodb_thread_concurrency=10
innodb_force_recovery=0

Железо виртуальное, 2 ядра и 3Гб памяти. Посещаемость минимальна.
На виртуальной и хостовой машине наблюдаю просадку по диску.

Неактивен

 

#2 15.03.2013 11:52:21

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Выборка из больших таблиц - биллинг из логов squid

Ну давайте для начала посмотрим на результаты:


EXPLAIN SELECT SUM(act.traffic) AS traffic, act.userId FROM `actions` `act` WHERE ((act.date >= 1362081601 AND act.date <= 1364759999) AND (act.cached = "no")) AND (act.userId IN ( 1, 2, 3, 4 ..... 49, 50 )) GROUP BY userId;
 

SELECT count(*) FROM `actions` `act`;

SELECT count(*) FROM `actions` `act` WHERE act.date >= 1362081601 AND act.date <= 1364759999;

SELECT count(*) FROM `actions` `act` WHERE act.userId IN ( 1, 2, 3, 4 ..... 49, 50 );

Неактивен

 

#3 17.03.2013 00:41:19

krevedko13
Участник
Зарегистрирован: 19.12.2010
Сообщений: 20

Re: Выборка из больших таблиц - биллинг из логов squid

Что-то я не понял как сюда несколько файлов прикрепить, по этому слепил в один.


Прикрепленные файлы:
Attachment Icon explainselect.png, Размер: 27,521 байт, Скачано: 671

Неактивен

 

#4 17.03.2013 03:35:18

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Выборка из больших таблиц - биллинг из логов squid

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson