Задавайте вопросы, мы ответим
Вы не зашли.
Есть БД такого вида:
DROP TABLE IF EXISTS `user`; DROP TABLE IF EXISTS `project`; DROP TABLE IF EXISTS `site`; DROP TABLE IF EXISTS `logdb`; CREATE TABLE `project` ( `id` SMALLINT(4) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(30) CHARACTER SET utf8 COLLATE utf8_bin ); CREATE TABLE `user` ( `id` SMALLINT(4) UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, `project_id` SMALLINT(4), `login` VARCHAR(30) NOT NULL UNIQUE, `first_name` VARCHAR(30), `second_name` VARCHAR(30), `middle_name` VARCHAR(30) ); CREATE TABLE `site` ( `id` INTEGER UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, `url` varchar(256) NOT NULL UNIQUE ); CREATE TABLE `logdb` ( `id` INTEGER UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, `date` DATE NOT NULL, `time` TIME NOT NULL, `size` INTEGER UNSIGNED NOT NULL, `ip` INTEGER(9) UNSIGNED NOT NULL, `user_id` SMALLINT(4) UNSIGNED NOT NULL, `site_id` INTEGER UNSIGNED NOT NULL );
Ежемесячно в таблицу logdb загружается от 15 до 20 миллионов строк. Работа с такой таблицей пока что неплохо учит медитации
Вот пример медитативного запроса:
SELECT sum(l.size), s.url, s.id AS sum FROM logdb AS l, site AS s WHERE l.user_id=100 AND MONTH(date)=1 AND s.id=l.site_id GROUP BY l.site_id
В индексах пока не силён, усиленно вникаю. Собственно вопрос: как можно оптимизировать запрос и какие индексы лучше создать для него ?
Неактивен
Ну, очевидно, нужен ключик на user_id. Если бы месяц писался отдельным полем,
то и на него нужно было бы этот ключик растянуть. В текущем варианте под MONTH()
оно никак не повлияет.
Возможно, имеет смысл бить табличку по месяцам (хотя бы PARTITIONING) — в таком
виде она у Вас вырастет очень быстро до неадминистрируемых размеров
Неактивен
Спасибо за ответ. Нашёл отличную статью по теме: http://dev.mysql.com/tech-resources/art … duler.html
Неактивен