我的查询显示不同的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
答案 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
希望这会缩短您的执行时间。