Правильная индексация в большой таблице - PullRequest
2 голосов
/ 21 августа 2009

У меня есть таблица с 8 миллионами записей, которая выглядит следующим образом:

CREATE TABLE `bdp_dosis` (
  `ID_INSTITUTION` varchar(4) NOT NULL default '',
  `ID_SERVICE` char(2) NOT NULL default '',
  `SECUENCIAL` char(3) NOT NULL default '',
  `TYPE` char(1) NOT NULL default '',
  `DATE_LECTURA` varchar(8) NOT NULL default '',
  `ID_TARJETA` varchar(9) default NULL,
  `DATE_ASIGNACION` varchar(8) NOT NULL default '',
  `DOSIS_1` int(11) default NULL,
  `DOSIS_2` int(11) default NULL,
  `COMMENT` char(1) NOT NULL default '',
  `CATEGORIA` char(2) default NULL,
  `TYPE_TRABAJO` char(2) default NULL,
  PRIMARY KEY  (`ID_INSTITUTION`, `ID_SERVICE`,`SECUENCIAL`, `TYPE`, `DATE_LECTURA`, `DATE_ASIGNACION`, `COMMENT`)) ENGINE=MyISAM

Дизайн таблицы не может быть изменен, но некоторые индексы сделают его менее плохим с этим запросом:

select d.ID_SERVICE,d.SECUENCIAL,d.TYPE,d.DATE_LECTURA,d.DATE_ASIGNACION,d.DOSIS_1,d.DOSIS_2,d.COMCOMMENT
from bdp_dosis d
where d.ID_INSTITUTION='46C7'
and d.DATE_asignacion>'20080100'
and d.DATE_asignacion<'20081232' and locate(d.COMMENT,'WQ')<>0
order by d.ID_SERVICE,d.SECUENCIAL,d.TYPE,d.fecha_lectura desc

Команда EXPLAIN говорит:

id  select_type  table  type  possible_keys  key      key_len  ref    
1   SIMPLE       d      ref   PRIMARY        PRIMARY  4        const  
rows    Extra
254269  Using where; Using filesort

Я пытался поставить индекс на ID_INSTITUTION-ID_SERVICE без особых результатов. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

Клавиши на ID_INSTITUTION и DATE_asignacion, скорее всего, помогут.

Если это все еще не слишком далеко, возможно, вы захотите перейти на MySQL 5.1 и использовать разбиение .

1 голос
/ 21 августа 2009

Индексы лучше всего работают со столбцами в предложении where, так как они помогают отфильтровать набор результатов. Значит, индексы надо ставить на ID_INSTITUTION И DATE_asignacion.

Однако эти индексы мало что дадут вам, если в вашем предложении where есть команда locate: это обычно запускает сканирование таблицы.

В целях скорости я бы также сделал DATE_asignacion целым числом, поскольку сравнения int выполняются быстрее, чем сравнения строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...