SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 26.02.2009 18:20:56

brokoli
Участник
Зарегистрирован: 26.02.2009
Сообщений: 10

большая таблица. select по дате.

Привет

есть большая таблица.
около 8 млн. записей. весит она 1.5 гига.

есть запрос, например,

Код:

select sum(size) from traffic where date_format(date, "%Y-%m") = '2009-02';

date - datetime
size - integer

который выполняется 30 секунд!

а если я рисую график не за один месяц а за пол года. а если хочу посчитать не только по месяцам но и по дням за последние 15 дней.

как можно оптимизировать ?
какие идеи ?

Неактивен

 

#2 26.02.2009 18:55:15

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: большая таблица. select по дате.

Нужно добавить индекс на поле `date`:

ALTER TABLE `traffic` ADD INDEX `date`(`date`)


Запрос за месяц:
SELECT SUM(`size`) FROM `traffic` WHERE `date` BETWEEN DATE('2009-02-01') AND LAST_DAY('2009-02-01')+INTERVAL 1 DAY


Если нужно по дням, то лучше DATETIME разбить на 2 поля DATE и TIME, или хотя бы просто выделить DATE и поставить на него индекс. Тогда запрос за последние 15 суток будет такой:
SELECT `date`,SUM(`size`) FROM `traffic` WHERE `date` BETWEEN CURRENT_DATE-INTERVAL 14 DAY AND CURRENT_DATE GROUP BY `date`

Отредактированно coin (26.02.2009 18:58:03)

Неактивен

 

#3 26.02.2009 23:27:26

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: большая таблица. select по дате.

Немного можно вырулить если тип поля дата на INT поменять и через UNIX_TIMESTAMP с ним общаться.

Но в целом похоже нормальное время выполнения запроса.
1,5 гига за какой период?
На месяц сколько в мегабайтах в первом приближении приходится?
Сколько диски в секунду отдают?

По сути я так понял идет перелопачивание очень большого количества записей, тут только костыли помогают.
Типа раз забрал и итоги в другую таблицу положил.
По другому никак.

Неактивен

 

#4 27.02.2009 14:12:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: большая таблица. select по дате.

Почему? По индексу должно range выбирать достаточно быстро — так, как coin написал

Неактивен

 

#5 02.03.2009 14:46:32

brokoli
Участник
Зарегистрирован: 26.02.2009
Сообщений: 10

Re: большая таблица. select по дате.

а что лучше datetime разбить на date и time + индекс
или сделать из datetime unix timestamp + индекс ???

Неактивен

 

#6 02.03.2009 15:07:54

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: большая таблица. select по дате.

С одним полем общаться обычно удобнее.

Неактивен

 

#7 02.03.2009 16:55:44

brokoli
Участник
Зарегистрирован: 26.02.2009
Сообщений: 10

Re: большая таблица. select по дате.

разбил поле date (datetime) на 2 поля - d (date)и t (time). создал индекс на d.
эффекта нет! ))

также создал поле timestamp в которое скопировал данные из date.. создал индекс.. прибавления в скорости так же нет! )

запрос выглядит таким образом

select sum(size) from table where d >='2009-02-01' and d <= '2009-02-25'

и

select sum(size) from table where timestamp >=unix_timestamp('2009-02-01') and timestamp <= unix_timestamp('2009-02-25' )

Неактивен

 

#8 02.03.2009 17:02:14

brokoli
Участник
Зарегистрирован: 26.02.2009
Сообщений: 10

Re: большая таблица. select по дате.

примечание

select count(*) ....... выполняется за ~2 сек.
а select sum(size) ....... - за ~30 сек.

Неактивен

 

#9 02.03.2009 18:19:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: большая таблица. select по дате.

explain таки напишите? smile

Неактивен

 

#10 02.03.2009 19:32:20

brokoli
Участник
Зарегистрирован: 26.02.2009
Сообщений: 10

Re: большая таблица. select по дате.

легко ))

mysql> explain select sum(size) from traffic_stats where `d` >= '2009-02-01' and `d` <= '2009-02-25';
+----+-------------+---------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+---------------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | traffic_stats | ALL  |  d_index      | NULL | NULL    | NULL | 5536848 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+---------+-------------+

Неактивен

 

#11 02.03.2009 20:25:43

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: большая таблица. select по дате.

А тот же explain на count(*) и show create table? smile

Есть ощущение, что count(*) с теми же ограничениями выберет что-то около 3 миллионов строк.

Неактивен

 

#12 19.03.2009 19:56:13

brokoli
Участник
Зарегистрирован: 26.02.2009
Сообщений: 10

Re: большая таблица. select по дате.

вот важные параметры

объем оперативной памяти 2 гигабайта
тип таблицы innodb
row format dynamic
размер таблицы 2 гигабайта
количество записей 7 млн
средний размер записи 294
размер индекса 600М

и самое интересное

query_cache_type=1
query_cache_size = 128M
join_buffer_size = 3M
table_cache = 3000
max_heap_table_size = 1601M
tmp_table_size = 1600M
innodb_buffer_pool_size = 1500M

Неактивен

 

#13 23.03.2009 13:20:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: большая таблица. select по дате.

Параметры, важные, но таки explain и show create table — важнее smile

Неактивен

 

Board footer

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