[英]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.