簡體   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