私はこのテーブルを持っています:
CREATE TABLE `ClientesHora_copy` (
`dia` varchar(6) default NULL,
`hora` varchar(2) default NULL,
`sit` varchar(17) default NULL,
`nodo` varchar(6) default NULL,
`clientes` decimal(41,0) default NULL,
`segundos` double default NULL,
`llamadas` decimal(41,0) default NULL,
`fecha` datetime default NULL,
KEY `nodo_fecha` (`nodo`,`fecha`),
KEY `nodo` (`nodo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
そしてこのクエリ:
SET @sitio= 'ABA000';
SET @horaini='2013-02-12 15:18:00';
SET @horafin='2013-02-12 20:36:00';
EXPLAIN SELECT nodo,sit,clientes,segundos,llamadas,fecha,hora,@horaini AS horaini,@horafin AS horafin
FROM `ClientesHora_copy`
WHERE
nodo =@sitio
AND
fecha BETWEEN DATE_SUB(DATE_FORMAT(@horaini, "%Y-%m-%d %H:00:00"), INTERVAL 7 DAY)
AND DATE_SUB(DATE_FORMAT(@horafin, "%Y-%m-%d %H:00:00"), INTERVAL 7 DAY)
私はこれを説明しています
id select_type table type possible_keys key key_len ref rows Extra
------ ----------- ----------------- ------ ------------- ------ ------- ------ ------- -------------
1 SIMPLE ClientesHora_copy ALL (NULL) (NULL) (NULL) (NULL) 2716460 Using where
ただし、@sitio 変数を使用しない場合 (ただし、@horaini、@horafin 変数を使用する場合):
EXPLAIN SELECT nodo,sit,clientes,segundos,llamadas,fecha,hora,@horaini AS horaini,@horafin AS horafin
FROM `ClientesHora_copy`
WHERE
nodo ='ABA000'
AND
fecha BETWEEN DATE_SUB(DATE_FORMAT(@horaini, "%Y-%m-%d %H:00:00"), INTERVAL 7 DAY)
AND DATE_SUB(DATE_FORMAT(@horafin, "%Y-%m-%d %H:00:00"), INTERVAL 7 DAY)
私はこれを得る:
id select_type table type possible_keys key key_len ref rows Extra
------ ----------- ----------------- ------ --------------- ---------- ------- ------ ------ -------------
1 SIMPLE ClientesHora_copy range nodo_fecha,nodo nodo_fecha 18 (NULL) 1 Using where
Mysql が @sitio 変数でインデックスを使用しないのに、@fechaini と @fechafin で使用する理由について何か考えはありますか?
ありがとう!