我目前正在尝试提高数据库中INSPECTION表的以下GROUP BY
查询的性能。
SET @EQUIPMENT_VARIABLE = 'B1010-V001';
SELECT EQUIPMENT_ID
, CML_ID
, GROUP_CONCAT(CASE WHEN STATUS = 'S' THEN 'S' END) AS SCOPED_INSPECTIONS
, MAX(CASE WHEN STATUS IN('A','R') THEN INSPECTION_DATE END) AS MAX_INSPECTION_DATE
, MAX(CASE WHEN STATUS IN('A','R') THEN CORROSION_RATE_ACTUAL_SHORT_TERM_MM_PER_YEAR END) AS MAX_CORROSION_RATE_ACTUAL_SHORT_TERM_MM_PER_YEAR
FROM INSPECTION
WHERE EQUIPMENT_ID = @EQUIPMENT_VARIABLE
GROUP BY EQUIPMENT_ID, CML_ID;
查询当前的执行时间为0.094秒。我注意到通过删除SELECT
查询中的三个未索引的聚合语句,执行时间减少到0.000秒。所以我的问题是......有没有办法重新设计我当前的GROUP BY
查询,或以某种方式优化我的聚合语句以改善查询时间?我已经提供了下面的INSPECTION表的DDL和大小......
记录数: 218,000
DDL / Schema
CREATE TABLE IDMAS_VESSELS.INSPECTION
( /*FIELD NAME*/ /*DATA TYPE AND RESTRICTIONS*/
`INSPECTION_NO` INT NOT NULL,
`STATUS` enum('P','A','S','R') NOT NULL default 'P',
`CML_ID` INT NOT NULL,
`EQUIPMENT_ID` VARCHAR(20),
`INSPECTION_TYPE` VARCHAR(50),
`SCOPE_COMMENTS` TEXT,
`NOMINAL_WALL_THICKNESS` DOUBLE,
`MINIMUM_REMAINING_WALL_THICKNESS` DOUBLE,
`WALL_LOSS` DOUBLE,
`SERVICE_YEARS` DOUBLE,
`CORROSION_RATE_ACTUAL_SHORT_TERM_MM_PER_YEAR` DOUBLE,
`CONDITION` VARCHAR(50),
`INSPECTION_DATE` DATE,
`NDT_REPORT_NUMBER` VARCHAR(20),
`INSPECTION_COMMENTS` TEXT,
`INSPECTION_SCOPE` TEXT,
`WORK_ORDER` TEXT,
`INPECTOR_NAME` VARCHAR(50),
`INPECTION_COMPANY` VARCHAR(50),
`PHOTO` INT NOT NULL AUTO_INCREMENT,
/*PRIMARY AND FOREIGN KEY DEFINITIONS*/
PRIMARY KEY (EQUIPMENT_ID, CML_ID, INSPECTION_NO),
FOREIGN KEY (EQUIPMENT_ID, CML_ID) REFERENCES CML(EQUIPMENT_ID, CML_ID),
/*ADD TABLE INDEXES TO IMPROVE PERFORMANCE*/
/*INDEX ON PHOTO FIELD REQUIRED TO ALLOW AUTO INCREMENTING OF FIELD*/
INDEX `PHOTO` (`PHOTO`)
-- INDEX INSPECTION_DATE (INSPECTION_DATE)
) ENGINE=InnoDB;
下面提供了EXPLAIN查询的结果......
+----+--------------+-------------+-------------+--------+---------------------+------------+----------+-------+--------+-----------+--------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------+-------------+-------------+--------+---------------------+------------+----------+-------+--------+-----------+--------------+
| 1 | SIMPLE | INSPECTION | NULL | index | 'PRIMARY', 'PHOTO' | 'PRIMARY' | 30 | NULL | 218851 | 100 | Using where |
+----+--------------+-------------+-------------+--------+---------------------+------------+----------+-------+--------+-----------+--------------+