MySQL - 使用SELECT语句中的非索引字段优化GROUP BY查询

时间:2016-11-04 03:17:12

标签: mysql sql group-by query-optimization

我目前正在尝试提高数据库中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 |
+----+--------------+-------------+-------------+--------+---------------------+------------+----------+-------+--------+-----------+--------------+

0 个答案:

没有答案