Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
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Гб памяти. Посещаемость минимальна.
На виртуальной и хостовой машине наблюдаю просадку по диску.
Неактивен
Ну давайте для начала посмотрим на результаты:
Неактивен
Что-то я не понял как сюда несколько файлов прикрепить, по этому слепил в один.
Неактивен
У вас используются оптимальные индексы. Возможно можно разогнать сервер и подправить конфигурацию, но потеря скорости будет расти с ростом записей.
Я советую в вашем случае делать суммирующие таблицы (дневные,недельные,месячные записи)
Неактивен
Страниц: 1