索引随varchar值更改

时间:2014-02-17 11:56:55

标签: mysql indexing

我的查询显示不同的varchar值不同。我的表结构如下。

CREATE TABLE `equipmentdata` (
`EqpmDataDBId` int(11) NOT NULL AUTO_INCREMENT,
`SerialNumber` double DEFAULT '0',
`ReadValue` float DEFAULT '0',
`ReadTime` varchar(25) DEFAULT NULL,
`DataType` varchar(100) DEFAULT NULL,
`EquipmentDBId` int(11) DEFAULT '0',
`EquipmentCustomId` varchar(50) DEFAULT NULL,
`LocationCustomId` varchar(50) DEFAULT NULL,
`ChannelCustomId` varchar(50) DEFAULT NULL,
`ChannelName` varchar(100) DEFAULT NULL,
`IsUploaded` tinyint(1) DEFAULT '0',
PRIMARY KEY (`EqpmDataDBId`),
UNIQUE KEY `SerialNumber`(`SerialNumber`,`EquipmentCustomId`,`LocationCustomId`,`ChannelCustomId`),
KEY `ReadTime` (`LocationCustomId`,`EquipmentCustomId`,`ChannelCustomId`,`ReadTime`),
KEY `SECONDARY` (`EqpmDataDBId`,`LocationCustomId`,`EquipmentCustomId`,`ChannelCustomId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

但是这个查询对不同的数据需要不同的时间。我的意思是使用辅助索引进行以下查询,但它不是。

SELECT * FROM EquipmentData WHERE   EqpmDataDBId > 41500823 AND 
LocationCustomId = '192.168.3.6-8050' AND EquipmentCustomId = 'TP-3'
AND ChannelCustomId = 'Temp-0'  ORDER BY EqpmDataDBId ASC LIMIT 25

1 个答案:

答案 0 :(得分:0)

您可以使用USE INDEX子句强制SQL优化器使用表中可用的索引。以下是相同的文档:http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

您的查询将转换为类似

的内容
SELECT * FROM EquipmentData 
USE INDEX(ReadTime,SECONDARY)
WHERE   EqpmDataDBId > 41500823 
AND LocationCustomId = '192.168.3.6-8050' 
AND EquipmentCustomId = 'TP-3'
AND ChannelCustomId = 'Temp-0'  
ORDER BY EqpmDataDBId ASC LIMIT 25

希望这会缩短您的执行时间。