Задавайте вопросы, мы ответим
Вы не зашли.
Привет
есть большая таблица.
около 8 млн. записей. весит она 1.5 гига.
есть запрос, например,
select sum(size) from traffic where date_format(date, "%Y-%m") = '2009-02';
date - datetime
size - integer
который выполняется 30 секунд!
а если я рисую график не за один месяц а за пол года. а если хочу посчитать не только по месяцам но и по дням за последние 15 дней.
как можно оптимизировать ?
какие идеи ?
Неактивен
Нужно добавить индекс на поле `date`:
Отредактированно coin (26.02.2009 18:58:03)
Неактивен
Немного можно вырулить если тип поля дата на INT поменять и через UNIX_TIMESTAMP с ним общаться.
Но в целом похоже нормальное время выполнения запроса.
1,5 гига за какой период?
На месяц сколько в мегабайтах в первом приближении приходится?
Сколько диски в секунду отдают?
По сути я так понял идет перелопачивание очень большого количества записей, тут только костыли помогают.
Типа раз забрал и итоги в другую таблицу положил.
По другому никак.
Неактивен
Почему? По индексу должно range выбирать достаточно быстро — так, как coin написал
Неактивен
а что лучше datetime разбить на date и time + индекс
или сделать из datetime unix timestamp + индекс ???
Неактивен
С одним полем общаться обычно удобнее.
Неактивен
разбил поле 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' )
Неактивен
примечание
select count(*) ....... выполняется за ~2 сек.
а select sum(size) ....... - за ~30 сек.
Неактивен
explain таки напишите?
Неактивен
легко ))
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 |
+----+-------------+---------------+------+---------------+------+---------+------+---------+-------------+
Неактивен
А тот же explain на count(*) и show create table?
Есть ощущение, что count(*) с теми же ограничениями выберет что-то около 3 миллионов строк.
Неактивен
вот важные параметры
объем оперативной памяти 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
Неактивен
Параметры, важные, но таки explain и show create table — важнее
Неактивен