繁体   English   中英

优化繁重的Mysql查询

[英]Optimize heavy Mysql query

我正在处理一个有时需要 10 多分钟才能完成的繁重查询。 我想知道这个查询是否有任何优化并改善处理时间。

SELECT 
    data.id,
    data.url,
    data.lastModified,
    data.absoluteNumber,
    JSON_OBJECT('name', data.projectName) AS project,
    JSON_OBJECT('module_id',
            data.module_id,
            'last_modified',
            data.moduleLastModified,
            'url',
            data.moduleUrl,
            'fullPath',
            CONCAT(data.modulePath, data.moduleName),
            'path',
            data.modulePath,
            'name',
            data.moduleName,
            'spice_process',
            data.spiceProcess,
            'baseline',
            'current') AS module,
    GROUP_CONCAT(DISTINCT JSON_OBJECT('name', ca.name, 'value', ca.value)) AS common_attributes,
    GROUP_CONCAT(DISTINCT JSON_OBJECT('name', da.name, 'value', da.value)) AS doors_attributes
FROM
    (SELECT DISTINCT
        fm.last_modified AS moduleLastModified,
            fm.url AS moduleUrl,
            fm.doors_path AS modulePath,
            fm.name AS moduleName,
            dod.id,
            dod.url AS url,
            dod.last_modified AS lastModified,
            do.abs_num AS absoluteNumber,
            project.name AS projectName,
            m.doors_module_id AS module_id,
            fm.spice_process AS spiceProcess
    FROM
        (SELECT fm.*
    FROM
        core_app_project AS project
    INNER JOIN core_app_formalmodule AS fm ON fm.project_id = project.id
    INNER JOIN core_app_module AS m ON m.id = fm.module_id
    WHERE
        fm.is_temp = 0 AND m.status = 'active'
            AND project.name IN (<project_name>)
            AND fm.is_last = 1) AS fm
    INNER JOIN core_app_project AS project ON project.id = fm.project_id
    INNER JOIN core_app_doorsobjectdata_formal_modules AS fmobj ON fmobj.formalmodule_id = fm.id
    INNER JOIN core_app_doorsobjectdata AS dod ON dod.id = fmobj.doorsobjectdata_id
    INNER JOIN core_app_module AS m ON m.id = fm.module_id
    INNER JOIN core_app_doorsobject AS do ON dod.doors_object_id = do.id
    WHERE 1) AS data
        LEFT JOIN
    core_app_doorsattribute AS da ON da.doors_object_data_id = data.id
        LEFT JOIN
    core_app_commonattribute AS ca ON ca.doors_object_data_id = data.id
GROUP BY data.id

此查询的一个派生表未使用索引。 这是解释查询。

解释查询

描述使用的表格:

MariaDB [test]> describe core_app_project;
+------------------+-------------+------+-----+---------+----------------+
| Field            | Type        | Null | Key | Default | Extra          |
+------------------+-------------+------+-----+---------+----------------+
| id               | int(11)     | NO   | PRI | NULL    | auto_increment |
| name             | varchar(45) | NO   | UNI | NULL    |                |
| doors_path       | longtext    | NO   |     | NULL    |                |
| business_unit_id | int(11)     | NO   | MUL | NULL    |                |
| das_source_id    | int(11)     | NO   | MUL | NULL    |                |
+------------------+-------------+------+-----+---------+----------------+


MariaDB [test]> describe core_app_formalmodule;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| last_modified     | datetime(6)  | NO   | MUL | NULL    |                |
| url               | varchar(500) | NO   | MUL | NULL    |                |
| doors_path        | longtext     | NO   | MUL | NULL    |                |
| spice_process     | varchar(45)  | NO   | MUL | NULL    |                |
| name              | varchar(255) | NO   | MUL | NULL    |                |
| is_temp           | tinyint(1)   | NO   | MUL | NULL    |                |
| is_last           | tinyint(1)   | NO   | MUL | NULL    |                |
| prefix            | varchar(100) | YES  |     | NULL    |                |
| prefix_reused     | varchar(100) | YES  |     | NULL    |                |
| module_id         | int(11)      | NO   | MUL | NULL    |                |
| project_id        | int(11)      | NO   | MUL | NULL    |                |
| update_request_id | int(11)      | NO   | UNI | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+


MariaDB [test]> describe core_app_module;
+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
| id              | int(11)     | NO   | PRI | NULL    | auto_increment |
| doors_module_id | varchar(45) | NO   | UNI | NULL    |                |
| status          | varchar(45) | NO   | MUL | NULL    |                |
| project_id      | int(11)     | YES  | MUL | NULL    |                |
+-----------------+-------------+------+-----+---------+----------------+

MariaDB [test]> describe core_app_doorsobjectdata;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| url             | varchar(255) | NO   | MUL | NULL    |                |
| last_modified   | datetime(6)  | NO   | MUL | NULL    |                |
| doors_object_id | int(11)      | NO   | MUL | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+

MariaDB [test]> describe core_app_doorsobjectdata_formal_modules;
+--------------------+---------+------+-----+---------+----------------+
| Field              | Type    | Null | Key | Default | Extra          |
+--------------------+---------+------+-----+---------+----------------+
| id                 | int(11) | NO   | PRI | NULL    | auto_increment |
| doorsobjectdata_id | int(11) | NO   | MUL | NULL    |                |
| formalmodule_id    | int(11) | NO   | MUL | NULL    |                |
+--------------------+---------+------+-----+---------+----------------+

MariaDB [test]> describe core_app_doorsobject;
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) | NO   | PRI | NULL    | auto_increment |
| abs_num   | int(11) | NO   | MUL | NULL    |                |
| module_id | int(11) | NO   | MUL | NULL    |                |
+-----------+---------+------+-----+---------+----------------+


MariaDB [test]> describe core_app_doorsattribute;
+----------------------+---------------------+------+-----+---------+----------------+
| Field                | Type                | Null | Key | Default | Extra          |
+----------------------+---------------------+------+-----+---------+----------------+
| id                   | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name                 | varchar(63)         | NO   | PRI | NULL    |                |
| value                | longtext            | NO   |     | NULL    |                |
| doors_object_data_id | int(11)             | NO   | MUL | NULL    |                |
+----------------------+---------------------+------+-----+---------+----------------+

MariaDB [test]> describe core_app_commonattribute;
+----------------------+---------------------+------+-----+---------+----------------+
| Field                | Type                | Null | Key | Default | Extra          |
+----------------------+---------------------+------+-----+---------+----------------+
| id                   | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name                 | varchar(63)         | NO   | PRI | NULL    |                |
| value                | varchar(127)        | NO   |     | NULL    |                |
| doors_object_data_id | int(11)             | NO   | MUL | NULL    |                |
+----------------------+---------------------+------+-----+---------+----------------+

如果这些索引没有足够的帮助,我会更深入地研究一下:

ca:  INDEX(doors_object_data_id,  name, value)
da:  INDEX(doors_object_data_id,  name, value)
fm:  INDEX(is_temp, is_last, project_id,  module_id)
project:  INDEX(name, id)
m:  INDEX(status, id)
fmobj:  INDEX(formalmodule_id,  doorsobjectdata_id)

如果value是数据类型TEXT ,则将其从索引中删除。 (这闻起来像 EAV 模式模式,很糟糕。)

“索引每一列”通常是一种浪费。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM