虽然MySQL和查询在执行方面非常快,但我的速度很慢。
硬件:
表中的总记录= 16,83,410
表格结构:
CREATE TABLE `test_result` (
`parameter_id` varchar(45) NOT NULL,
`parameter_value` varchar(5000) DEFAULT NULL,
`test_id` varchar(45) NOT NULL,
`package_id` varchar(45) DEFAULT NULL,
`client_id` varchar(45) NOT NULL,
`added_by` varchar(45) DEFAULT NULL,
`added_on` varchar(45) DEFAULT NULL,
`modify_by` varchar(45) DEFAULT NULL,
`modify_on` varchar(45) DEFAULT NULL,
`test_result_status` varchar(45) DEFAULT NULL,
`analysis_comment` varchar(5000) DEFAULT NULL,
`report_id` varchar(45) NOT NULL,
PRIMARY KEY (`report_id`,`client_id`,`test_id`,`parameter_id`),
KEY `ehr_test_result_index` (`report_id`,`client_id`,`test_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
查询:
SELECT parameter_id,parameter_value
FROM test_result
WHERE client_id = 14274 and report_id = 266432 and test_id = 21;
所以,我正在对单个表执行查询,执行时间= 16秒:(
当我重新运行查询时,需要4秒,并且在第3秒内 (看起来像正在使用缓存或某种索引)
如何优化此查询?我应该将parameter_id,client_id,report_id,test_id转换为数字类型吗?
答案 0 :(得分:0)
索引绝对是关键。数字索引处理起来要简单得多,字段本身也要小得多。你现在有:
`parameter_id` varchar(45)
`test_id` varchar(45)
`client_id` varchar(45)
`report_id` varchar(45)
这意味着每个索引字段为45 x 4 = 180字节!如果你必须存储为文本,那将归结为(对于相当于32位整数的典型数字字段)7个字节。当然,存储为实际的32位整数(INT)将只有4个字节。 4 x 4 = 16个字节。这意味着读取大约1/10以找到正确的值,加上与此相关的其他优化是一个简单的整数,而不是在数字和文本之间进行转换。我相信它会在查询时间内产生巨大差异。
您也不需要第二个索引,因为PRIMARY KEY包含相同序列中第二个KEY中的所有内容。