Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 大表中的正确索引_Mysql_Database_Indexing - Fatal编程技术网

Mysql 大表中的正确索引

Mysql 大表中的正确索引,mysql,database,indexing,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

我有一个包含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

我试图在
ID\u INSTITUTION-ID\u SERVICE
上建立一个索引,但没有大的结果。有什么想法吗?

ID\u INSTITUTION
DATE\u asignacion
上的一个键更有可能帮助


如果这仍然不能让您走得更远,那么您可能需要研究mysql 5.1并使用。

索引对
where
子句中的列最有效,因为它们有助于过滤列出的结果。因此,索引应该放在
ID\u INSTITUTION
DATE\u asignacion

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


为了提高速度,我还将DATE_asignacion设置为整数,因为int比较比字符串比较快。

@chaos:可能是一个智能日期键。在数据仓库中一直使用这些。日期类型是完美的,但这不是我的决定。
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