gpt4 book ai didi

具有 2 个内部连接的 MySQL 慢查询

转载 作者:可可西里 更新时间:2023-11-01 07:39:41 24 4
gpt4 key购买 nike

以下查询需要 4 秒才能运行,我不知道为什么,因为索引结果很低。它的工作方式无法更改(因为它是从 2 个不同系统获取 appName 的兼容性查询)

你有什么想法吗?

SELECT runList.appName
FROM projectList
INNER JOIN varMeta ON (projectList.id = varMeta.projectId)
INNER JOIN runList ON (projectList.projectName = runList.appName)
WHERE varMeta.htmlvar_content = "example-app-name"
ORDER BY runList.id DESC
LIMIT 1;
+----+-------------+-------------+-------+--------------------+-------------+---------+---------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+--------------------+-------------+---------+---------------------------+------+-------------+
| 1 | SIMPLE | runList | index | env,appName,all | PRIMARY | 8 | NULL | 3 | Using where |
| 1 | SIMPLE | projectList | ref | PRIMARY,appNameIDX | appNameIDX | 138 | compat.runList.appName | 1 | Using where |
| 1 | SIMPLE | varMeta | ref | varMetaIDX | varMetaIDX | 5 | compat.projectList.id | 63 | Using where |
+----+-------------+-------------+-------+--------------------+-------------+---------+---------------------------+------+-------------+

这是该查询的配置文件:

+--------------------+----------+
| Status | Duration |
+--------------------+----------+
| starting | 0.000215 |
| Opening tables | 0.000043 |
| System lock | 0.000034 |
| Table lock | 0.000015 |
| init | 0.000081 |
| optimizing | 0.000029 |
| statistics | 0.000345 |
| preparing | 0.000033 |
| executing | 0.000009 |
| Sorting result | 0.000009 |
| Sending data | 3.023702 |
| end | 0.000018 |
| query end | 0.000004 |
| freeing items | 0.000223 |
| logging slow query | 0.000004 |
| cleaning up | 0.000005 |
+--------------------+----------+

最佳答案

这里我猜一下,因为你没有告诉我们你有什么字段或索引,也没有提到每个表的行数。 (所以这可能是垃圾)。

您需要varMeta.html_varcontent 的特定单个值,然后您需要加入varMeta.projectID。因此,在您的 varMeta 表上创建一个复合索引 (html_varcontent, projectID)。为什么这有帮助?因为你想要索引中最左边列的某个值,然后 MySQL 需要检索其他列的所有可能值。 MySQL 可以随机访问然后通过索引扫描该数据,而不必使用表数据。它更快。

同样,您正在 runList 表上执行 ORDER BY id DESC LIMIT 1 操作。为了使它有效地工作,请尝试在 runList 表上创建复合索引 (appName, id)。您的连接操作查找 appName 的一个或多个值,然后必须查找数值最高的 id 编号。这在复合索引中执行起来很快。

最后,projectList 表中的以下两个复合索引之一应该会有所帮助:(id, appName)(appName, id)。选择哪一个取决于 MySQL 在其他索引可用后如何优化您的查询。

关于具有 2 个内部连接的 MySQL 慢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24612120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com