Задавайте вопросы, мы ответим
Вы не зашли.
Имеется таблица на 100 000 000 записей c единственным составным PK индексом (site_id, dt, model_id), тип таблицы MyISAM. По таблице выполняется единственный запрос. Подскажите пожалуйста, оптимально ли работает индекс? Меня в EXPLAIN смущает "Using temporary; Using filesort", я правильно понимаю, что mysql делает по индексу выборку из 34515 строк, записывает эти строки во временный файл на диск, сортирует и затем отдает рекордсет? Если это так, то можно ли как-то избавиться от создания временного файла?
И еще вопрос, таблица очень большая и пришло время ее оптимизировать. Пока вижу путь разбить ее на 10 маленьких таблиц (логика приложения такое позволяет), как вы думает это правильный путь и нет ли в mysql штатных средств для "борьбы" с большими таблицами?
ven@zzz:~$ mysql --version mysql Ver 14.7 Distrib 4.1.11, for pc-linux-gnu (i386) mysql> show create table wl_stat_model; +---------------+----------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------------+----------------------------------------------------------------------------------------------------------------------------+ | wl_stat_model | CREATE TABLE `wl_stat_model` ( `site_id` int(4) unsigned NOT NULL default '0', `model_id` int(4) unsigned NOT NULL default '0', `dt` datetime NOT NULL default '0000-00-00 00:00:00', `hits` int(4) unsigned default '0', PRIMARY KEY (`site_id`,`dt`,`model_id`) ) ENGINE=MyISAM DEFAULT CHARSET=koi8r | mysql> explain select model_id, sum(hits) as hits from stat where site_id='1' and dt>='2007-07-28 00:00:00' and dt<='2007-10-25 23:59:59' group by model_id order by hits desc; +----+-------------+---------------+-------+---------------+---------+---------+------+-------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------------+-------+---------------+---------+---------+------+-------+----------------------------------------------+ | 1 | SIMPLE | wl_stat_model | range | PRIMARY | PRIMARY | 12 | NULL | 34515 | Using where; Using temporary; Using filesort | +----+-------------+---------------+-------+---------------+---------+---------+------+-------+----------------------------------------------+ 1 row in set (6.32 sec)
Неактивен
Да, работает он именно так, за исключением того, что запись на диск происходит не
обязательно. Если размер временной таблички меньше tmp_table_size, то все происходит
в оперативной памяти.
Разбить таблицу на несколько - это нормальная практика, в сервере 5.1 для этого сделано
встроенное разбивание (partitioning).
Индекс у Вас используется нормально за исключением того, что model_id из этого индекса
не используется вообще. Дело в том, что после выборки по RANGE, MySQL уже не может
использовать этот индекс дальше для GROUP/ORDER.
Как вариант - можете хранить колонку промежуточных данных (date_int), в которой хранить
дату без времени. Тогда запрос вида ... date_int IN (...) будет использовать индекс лучше.
Неактивен