查询大表非常慢

时间:2017-11-08 17:54:00

标签: mysql sql

虽然MySQL和查询在执行方面非常快,但我的速度很慢。

硬件:

  • RAM => 8 GB
  • 双核处理器
  • Windows Server
  • 任务管理器:内存30%

表中的总记录= 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转换为数字类型吗?

1 个答案:

答案 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中的所有内容。