SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 26.10.2007 13:45:13

eshum
Участник
Зарегистрирован: 26.10.2007
Сообщений: 3

Таблица на 100M записей

Имеется таблица на 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)

Неактивен

 

#2 26.10.2007 19:36:48

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

Re: Таблица на 100M записей

Да, работает он именно так, за исключением того, что запись на диск происходит не
обязательно. Если размер временной таблички меньше tmp_table_size, то все происходит
в оперативной памяти.

Разбить таблицу на несколько - это нормальная практика, в сервере 5.1 для этого сделано
встроенное разбивание (partitioning).

Индекс у Вас используется нормально за исключением того, что model_id из этого индекса
не используется вообще. Дело в том, что после выборки по RANGE, MySQL уже не может
использовать этот индекс дальше для GROUP/ORDER.

Как вариант - можете хранить колонку промежуточных данных (date_int), в которой хранить
дату без времени. Тогда запрос вида  ... date_int IN (...) будет использовать индекс лучше.

Неактивен

 

Board footer

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