当用户 activity 增加时,查询时间增加并且应用程序挂起
When the user activity increases the query time increases and application hangs
PHP版本:7.3.19
mysql版本:10.4.13(Maria DB-社区版)
我是 运行 Linux 上的一个应用程序,使用 PHP 和 Mysql。当 20-25 人使用该应用程序时,我们有多个查询运行得非常好。但是当用户超过 30 个时,查询变得很慢。有 500 多个用户想要使用此应用程序。如果其中一个查询需要 0.188844 秒来执行,但是当有许多用户同时尝试执行相同的操作 activity 时,进程会变得非常慢并且有时需要大约 21.017460 秒来执行。
以下是慢查询日志中的一些示例:
===============# Time: 220601 7:42:44
# User@Host: root[root] @ WIN-MN0PM3TE06L [10.15.51.252]
# Thread_id: 41274 Schema: mahabhumi_prod8 QC_hit: No
# Query_time: 0.188844 Lock_time: 0.000154 Rows_sent: 0 Rows_examined: 51848
# Rows_affected: 0 Bytes_sent: 10337
SET timestamp=1654049564;
SELECT *
FROM (`kcc_requests`)
WHERE `aadhar_num` = 'XXXXX';
===============# Time: 220601 14:12:13
# User@Host: root[root] @ WIN-MUQCJ3KLLE2 [10.15.51.250]
# Thread_id: 81466 Schema: mahabhumi_prod8 QC_hit: No
# Query_time: 21.017460 Lock_time: 0.000071 Rows_sent: 0 Rows_examined: 52692
# Rows_affected: 0 Bytes_sent: 10337
SET timestamp=1654072933;
SELECT *
FROM (`kcc_requests`)
WHERE `aadhar_num` = 'YYYYY';
=================
我们已将索引放入所有经常查询的列中。
设置有问题吗?是否要进行任何配置以允许更多用户使用该应用程序?
对于初学者,您需要
INDEX(aadhar_num)
添加该索引后,您可能会发现其他查询“缓慢”地浮出水面。让我们看看 SHOW CREATE TABLE
和主要查询。
以 aadhar_num + 其他列开始的新索引不存在。
请重新创建。
请考虑在您的系统拥有超过 25 个用户时进行测试
的查询
SELECT *
从 (kcc_requests
)
其中 aadhar_num
= 'XXXXX';
改为
SELECT *
从 (kcc_requests
)
其中 aadhar_num
= nnnnnnn;
避免在访问 table 的索引之前浪费 CPU 时间从字母数字到数字。
如果这不能使您的查询更快,您的索引可能已损坏。
要创建当前索引,您有两种选择。
分析 TABLE kcc_requests;最省时
要么
优化 TABLE kcc_requests;重新创建索引并尽量减少 table.
中使用的 data_free space
PS,您最近发布的是 SHOW CREATE TABLE 的结果 - 没有您稍后创建的新索引。请按照建议重新创建索引。
PHP版本:7.3.19 mysql版本:10.4.13(Maria DB-社区版) 我是 运行 Linux 上的一个应用程序,使用 PHP 和 Mysql。当 20-25 人使用该应用程序时,我们有多个查询运行得非常好。但是当用户超过 30 个时,查询变得很慢。有 500 多个用户想要使用此应用程序。如果其中一个查询需要 0.188844 秒来执行,但是当有许多用户同时尝试执行相同的操作 activity 时,进程会变得非常慢并且有时需要大约 21.017460 秒来执行。
以下是慢查询日志中的一些示例:
===============# Time: 220601 7:42:44
# User@Host: root[root] @ WIN-MN0PM3TE06L [10.15.51.252]
# Thread_id: 41274 Schema: mahabhumi_prod8 QC_hit: No
# Query_time: 0.188844 Lock_time: 0.000154 Rows_sent: 0 Rows_examined: 51848
# Rows_affected: 0 Bytes_sent: 10337
SET timestamp=1654049564;
SELECT *
FROM (`kcc_requests`)
WHERE `aadhar_num` = 'XXXXX';
===============# Time: 220601 14:12:13
# User@Host: root[root] @ WIN-MUQCJ3KLLE2 [10.15.51.250]
# Thread_id: 81466 Schema: mahabhumi_prod8 QC_hit: No
# Query_time: 21.017460 Lock_time: 0.000071 Rows_sent: 0 Rows_examined: 52692
# Rows_affected: 0 Bytes_sent: 10337
SET timestamp=1654072933;
SELECT *
FROM (`kcc_requests`)
WHERE `aadhar_num` = 'YYYYY';
=================
我们已将索引放入所有经常查询的列中。
设置有问题吗?是否要进行任何配置以允许更多用户使用该应用程序?
对于初学者,您需要
INDEX(aadhar_num)
添加该索引后,您可能会发现其他查询“缓慢”地浮出水面。让我们看看 SHOW CREATE TABLE
和主要查询。
以 aadhar_num + 其他列开始的新索引不存在。
请重新创建。
请考虑在您的系统拥有超过 25 个用户时进行测试
的查询SELECT *
从 (kcc_requests
)
其中 aadhar_num
= 'XXXXX';
改为
SELECT *
从 (kcc_requests
)
其中 aadhar_num
= nnnnnnn;
避免在访问 table 的索引之前浪费 CPU 时间从字母数字到数字。
如果这不能使您的查询更快,您的索引可能已损坏。
要创建当前索引,您有两种选择。 分析 TABLE kcc_requests;最省时 要么 优化 TABLE kcc_requests;重新创建索引并尽量减少 table.
中使用的 data_free spacePS,您最近发布的是 SHOW CREATE TABLE 的结果 - 没有您稍后创建的新索引。请按照建议重新创建索引。