在大表中正确编制索引

时间:2009-08-21 11:43:28

标签: mysql database indexing

我有一张包含800万条记录的表格,如下所示:

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 个答案:

答案 0 :(得分:3)

ID_INSTITUTIONDATE_asignacion上的密钥更有可能提供帮助。

如果仍然没有让你走得太远,你可能需要考虑转到mysql 5.1并使用partitioning

答案 1 :(得分:1)

指数在where子句中的列上效果最佳,因为它们有助于过滤结果集。因此,索引应放在ID_INSTITUTION AND DATE_asignacion

但是,如果在locate子句中有where命令,那么这些索引对您来说几乎没有好处:这通常会启动表扫描。

出于速度目的,我还将DATE_asignacion设为整数,因为int比较比字符串比较更快。