2009-08-21 113 views
2

我有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沒有大的結果。任何想法?

回答

3

一個鍵ID_INSTITUTIONDATE_asignacion更有可能幫助。

如果仍然沒有得到你很遠,你可能要考慮將MySQL 5.1中使用partitioning

1

指數很好的工作在列where子句中,因爲它們可以幫助過濾結果集了。因此,指數應放在ID_INSTITUTIONDATE_asignacion

但是,如果在where子句中有locate命令,那麼這些索引對你幾乎沒有好處:這通常會啓動表掃描。

對於速度的目的,我還會做DATE_asignacion一個整數,因爲INT比較比字符串比較快。

+0

或者,你知道,一個'DATE'。 – chaos 2009-08-21 11:48:56

+0

@chaos:可能是智能日期鍵。一直在數據倉庫中使用這些。 – Eric 2009-08-21 11:50:20

+0

日期類型是完美的,但這不是我的決定。 – jcasalruiz 2009-08-21 11:54:43