2009-08-21 8 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 

私はでインデックスを入れてみました大きな結果はありません。何か案が?

答えて

3

ID_INSTITUTIONDATE_asignacionのキーが役に立つ可能性があります。

まだそれほど遠くない場合は、mysql 5.1に行き、partitioningを参照してください。

1

インデックスは、結果セットのフィルタリングに役立つので、where句のカラムで最もよく機能します。エルゴ、インデックスはID_INSTITUTIONDATE_asignacionに置く必要があります。

where句にlocateコマンドがある場合、これらのインデックスはほとんど役に立たないでしょう。これは、通常、テーブルスキャンを開始します。

スピードの目的で、int比較は文字列比較より速いので、DATE_asignacionも整数にします。

+0

または、ご存知のとおり、「DATE」です。 – chaos

+0

@chaos:スマートな日付キーにすることができます。これらはデータウェアハウスで常に使用してください。 – Eric

+0

日付のタイプは完璧ですが、それは私の決断ではありません。 – jcasalruiz

関連する問題