当用户 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 的结果 - 没有您稍后创建的新索引。请按照建议重新创建索引。