0

我们为我们的客户管理一个网站,该网站正在处理严重的性能问题。该网站是在 CMS 中构建的,最多同时处理 20 位访问者。只要网站的访问者是网站的唯一用户,一切都会顺利。CMS 构建缓存并且将 mysql 查询的使用保持在最低限度。

当我们客户的员工开始自己在网站上工作时,性能开始缺乏。整个工作流程通过网站进行,包括更新数据库中的记录和插入新记录。当记录更新时,删除或插入的缓存被删除,因此网站访问者的操作将导致查询。

我的第一个问题是 mysql 应该能够处理这些请求吗?即使数据库的设计不好(见下文)。当我在 mysql 中查看进程列表时,我看到简单的查询最多需要 15 秒。当同时有更新或插入查询时,这些查询似乎只需要很长时间。

在保存所有记录的大桌子下方。网站前端使用的所有内容都存储在这张表中。包括二进制文件。该表共有 8,676 条记录。前端有很多使用 WHERE 的查询,例如 Variabele5 或 Variabele6 这些 Variabele 字段的值取决于内容类型。

WHERE 例如:

WHERE Variabele5 > 500 AND Variabele6 =2 AND contenttype = 35

所有员工工作的环境都不会被缓存。在这种环境中,有一些带有顺序和搜索选项的列表。这些查询尽可能多地被 memcached,但是当记录被更新、删除或插入时,memcache 会被清除。这与插入、更新和删除操作相结合可能是瓶颈。

所以我的问题是mysql应该能够处理这一切,还是数据库的设计不好处理请求。

+---------------+---------------+------+-----+---- -----+----------------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+---------------+---------------+------+-----+---- -----+----------------+
| 天然橡胶 | 中型(80) | 否 | 优先级 | 空 | 自动增量 |
| 隐藏 | 整数(1) | 否 | | 0 | |
| 标题 | varchar(255) | 否 | 穆尔 | | |
| 身体 | 正文 | 否 | | 空 | |
| 说明 | 正文 | 否 | | 空 | |
| 用户 ID | 中型(80) | 否 | | 0 | |
| 添加 | varchar(255) | 否 | | 空 | |
| 修改日期 | varchar(255) | 否 | | 空 | |
| 内容类型 | 中型(80) | 否 | 穆尔 | 0 | |
| 家长 | 中型(80) | 否 | | 0 | |
| 状态 | 中型(80) | 否 | 穆尔 | 空 | |
| 代码 | varchar(255) | 否 | 穆尔 | 空 | |
| 菜单 | 中型(80) | 否 | | 空 | |
| 文件类型 | 中型(80) | 否 | | 空 | |
| 文件夹 | 整数(11) | 否 | | 空 | |
| 排序索引 | 大整数(255) | 否 | | 空 | |
| 服务器缓存 | 整数(1) | 否 | | 1 | |
| 未来缓存 | 整数(1) | 否 | | 空 | |
| 发布自 | 日期 | 是 | | 空 | |
| 发布到 | 日期 | 是 | | 空 | |
| 固定 | 整数(11) | 是 | | 空 | |
| 关键词 | 正文 | 否 | | 空 | |
| 最新版本 | 整数(11) | 否 | | 空 | |
| 固定链接 | 正文 | 否 | | 空 | |
| 整数1 | 整数(12) | 否 | | 0 | |
| 整数2 | 整数(4) | 否 | | 0 | |
| 整数3 | 整数(4) | 否 | | 0 | |
| 整数4 | 整数(4) | 否 | | 0 | |
| 变量1 | varchar(255) | 否 | | | |
| 变量2 | varchar(255) | 否 | | | |
| 变量3 | varchar(255) | 否 | | | |
| 变量4 | varchar(255) | 否 | | | |
| 日期1 | varchar(255) | 否 | | | |
| 日期2 | varchar(255) | 否 | | | |
| 文本1 | 正文 | 否 | | 空 | |
| 文本2 | 正文 | 否 | | 空 | |
| 文本3 | 正文 | 否 | | 空 | |
| 二进制1 | 长块 | 否 | | 空 | |
| 二进制1类型 | varchar(255) | 否 | | 空 | |
| 二进制2 | 长块 | 否 | | 空 | |
| 二进制2类型 | varchar(255) | 否 | | 空 | |
| 二进制3 | 长块 | 否 | | 空 | |
| Binary3Type | varchar(255) | 否 | | 空 | |
| 浏览访问 | varchar(255) | 否 | | 空 | |
| 二进制4 | 长块 | 否 | | 空 | |
| Binary4Type | varchar(255) | 否 | | 空 | |
| 二进制5 | 长块 | 否 | | 空 | |
| Binary5Type | varchar(255) | 否 | | 空 | |
| 二进制6 | 长块 | 否 | | 空 | |
| 二进制6类型 | varchar(255) | 否 | | 空 | |
| 整数5 | 整数(11) | 否 | | 空 | |
| 整数6 | 整数(11) | 否 | | 空 | |
| 变量6 | varchar(255) | 否 | | 空 | |
| 二进制7 | 长块 | 否 | | 空 | |
| Binary7Type | varchar(255) | 否 | | 空 | |
| 二进制8 | 长块 | 否 | | 空 | |
| 二进制8类型 | varchar(255) | 否 | | 空 | |
| 二进制9 | 长块 | 否 | | 空 | |
| Binary9Type | varchar(255) | 否 | | 空 | |
| 二进制10 | 长块 | 否 | | 空 | |
| 二进制10类型 | varchar(255) | 否 | | 空 | |
| 二进制11 | 长块 | 否 | | 空 | |
| 二进制11类型 | varchar(255) | 否 | | 空 | |
| 二进制12 | 长块 | 否 | | 空 | |
| 二进制12类型 | varchar(255) | 否 | | 空 | |
| 二进制13 | 长块 | 否 | | 空 | |
| 二进制13类型 | varchar(255) | 否 | | 空 | |
| 二进制14 | 长块 | 否 | | 空 | |
| Binary14 类型 | varchar(255) | 否 | | 空 | |
| 二进制15 | 长块 | 否 | | 空 | |
| Binary15 类型 | varchar(255) | 否 | | 空 | |
| 文本4 | 正文 | 否 | | 空 | |
| 正文5 | 正文 | 否 | | 空 | |
| 正文6 | 正文 | 否 | | 空 | |
| 正文7 | 正文 | 否 | | 空 | |
| 正文8 | 正文 | 否 | | 空 | |
| 变量5 | varchar(255) | 否 | | 空 | |
| 变量7 | varchar(255) | 否 | | 空 | |
| 变量8 | varchar(255) | 否 | | 空 | |
| 变量9 | varchar(255) | 否 | | 空 | |
| 变量10 | 正文 | 否 | | 空 | |
| 变量11 | varchar(255) | 否 | | 空 | |
| 变量12 | varchar(255) | 否 | | 空 | |
| 变量13 | varchar(255) | 否 | | 空 | |
| 变量14 | varchar(255) | 否 | | 空 | |
| 变量15 | varchar(255) | 否 | | 空 | |
| 变量16 | varchar(255) | 否 | | 空 | |
| 变量17 | varchar(255) | 否 | | 空 | |
| 变量18 | varchar(255) | 否 | | 空 | |
| 变量19 | varchar(255) | 否 | | 空 | |
| 变量20 | varchar(255) | 否 | | 空 | |
| 变量21 | varchar(255) | 否 | | 空 | |
| 变量22 | varchar(255) | 否 | | 空 | |
| 变量23 | varchar(255) | 否 | | 空 | |
| 变量24 | varchar(255) | 否 | | 空 | |
| 变量25 | varchar(255) | 否 | | 空 | |
| 变量26 | varchar(255) | 否 | | 空 | |
| 变量27 | varchar(255) | 否 | | 空 | |
| 变量28 | varchar(255) | 否 | | 空 | |
| 变量29 | varchar(255) | 否 | | 空 | |
| 变量30 | varchar(255) | 否 | | 空 | |
| 变量31 | varchar(255) | 否 | | 空 | |
| 变量32 | varchar(255) | 否 | | 空 | |
| 变量33 | varchar(255) | 否 | | 空 | |
| 变量34 | varchar(255) | 否 | | 空 | |
| 变量35 | varchar(255) | 否 | | 空 | |
| 变量36 | varchar(255) | 否 | | 空 | |
| 变量37 | varchar(255) | 否 | | 空 | |
| 变量38 | varchar(255) | 否 | | 空 | |
| 变量39 | varchar(255) | 否 | | 空 | |
| 变量40 | varchar(255) | 否 | | 空 | |
| 变量41 | varchar(255) | 否 | | 空 | |
| 变量42 | varchar(255) | 否 | | 空 | |
| 变量43 | varchar(255) | 否 | | 空 | |
| 变量44 | varchar(255) | 否 | | 空 | |
| 变量45 | varchar(255) | 否 | | 空 | |
| 变量46 | varchar(255) | 否 | | 空 | |
| 变量47 | varchar(255) | 否 | | 空 | |
| 变量48 | varchar(255) | 否 | | 空 | |
| 变量49 | varchar(255) | 否 | | 空 | |
| 变量50 | varchar(255) | 否 | | 空 | |
+---------------+---------------+------+-----+---- -----+----------------+

索引:

+-------------+-------------+--------------+-- --------+--------+
| 键名 | Seq_in_index | 列名 | 基数| 空 |
+-------------+-------------+--------------+-- --------+--------+
| 初级 | 1 | 天然橡胶 | 8675 | |
| 状态 | 1 | 状态 | 5 | |
| 状态 | 2 | 发布自 | 8675 | 是 |
| 状态 | 3 | 发布到 | 8675 | 是 |
| 代码 | 1 | 代码 | 4337 | |
| 代码 | 2 | 标题 | 4337 | |
| 内容类型 | 1 | 内容类型 | 30 | |
| 标题 | 1 | 标题 | 2891 | |
+-------------+-------------+--------------+-- --------+--------+

服务器信息:4x Intel(R) Xeon(R) CPU L5630 @ 2.13GHz

+-------------------------------------------------- --------------------------+
| 免费-mt |
+-------------------------------------------------- --------------------------+
| 缓存的已用空闲共享缓冲区总数 |
| 电话:4096 3841 254 0 44 1223 |
| -/+ 缓冲区/缓存:2573 1522 |
| 交换:1023 422 601 |
| 总计:5119 4263 856 |
+-------------------------------------------------- --------------------------+

如果我需要提供任何其他信息,请告诉我。

编辑:一些示例查询

查询各不相同,但这里有一些示例:

员工搜索查询:

EXPLAIN SELECT profiel.nr as nr, CONCAT(profiel.title,' ',profiel.Variabele49) as naam,profiel.Variabele3 as tel, profiel.Variabele44 as huurprijs, profiel.Variabele5 as inkomen, profiel.Variabele39 as  personen, profiel.Variabele46 as perdatum, profiel.addate as inschrijving, profiel.text1 as opmerkingen, medewerker.Title as m_naam,profiel.Variabele48 as lang FROM  site_content as profiel    left join vw_activeContent as medewerker on medewerker.nr = profiel.Variabele9  WHERE  profiel.contenttype =26  AND (profiel.Status=3 OR  profiel.Text8='Nee')  AND (  profiel.nr  LIKE '%Rem%' OR  profiel.title LIKE '%Rem%' OR ' ' LIKE '%Rem%' OR  CONCAT(profiel.title,' ',profiel.Variabele49)  LIKE '%Rem%' OR profiel.Variabele49  LIKE '%Rem%' OR profiel.Variabele3  LIKE '%Rem%' OR  profiel.Variabele44  LIKE '%Rem%' OR  profiel.Variabele5  LIKE '%Rem%' OR  profiel.Variabele39  LIKE '%Rem%' OR  profiel.Variabele46  LIKE '%Rem%' OR  profiel.addate  LIKE '%Rem%' OR  profiel.text1  LIKE '%Rem%' OR  medewerker.Title  LIKE '%Rem%' OR profiel.Variabele48  LIKE '%Rem%' OR profiel.Variabele1 LIKE '%Rem%' OR profiel.Variabele3 LIKE '%Rem%' )  ORDER BY  profiel.sortIndex
+----+-------------+--------+--------------+------- -+----------------+--------------------+---------- ---+---+---------+--------+---+------- ------+------------------+--------+
| 编号 | 选择类型 | 表| | 类型 | 可能的键 | | 关键 | | key_len | 参考 | | | 行 | 额外 |
+----+-------------+--------+--------------+------- -+----------------+--------------------+---------- ---+---+---------+--------+---+------- ------+------------------+--------+
| 1 | 简单 | | 简介 | | 参考 | 状态,内容类型 | 内容类型 | 3 | 常量 | | | 1700 | 使用哪里;使用文件排序 | |
| 1 | 简单 | | 网站内容 | eq_ref | 初级,状态 | | 初级 | | 3 | profiel.Variabele9 | 1 | 使用位置 | | |
+----+-------------+--------+--------------+------- -+----------------+--------------------+---------- ---+---+---------+--------+---+------- ------+------------------+--------+

搜索查询访问者

EXPLAIN SELECT nr, title AS adres, Description AS description, Binary3 AS bin, Variabele2 AS 
TYPE , Text3, Text2 AS verhuurd, Integer2 AS kamers, Integer3 AS personen, Variabele4 AS inclusief, Text1 AS oplevering, Integer5 AS huurpijs, Variabele6 AS wijk, moddate
FROM vw_activeContent
WHERE contenttype =22
AND Integer2 >=2
AND Integer3 >=1
AND Integer5 >380
AND Integer5 <770
ORDER BY Integer5 ASC
+----+-------------+--------+--------------+------+ --------------------+-------------+-----+--------+- --------+-----------------------------+------+---- ---+
| 编号 | 选择类型 | 表| | 类型 | 可能的键 | | 关键 | | key_len | 参考 | 行 | 额外 |
+----+-------------+--------+--------------+------+ --------------------+-------------+-----+--------+- --------+-----------------------------+------+---- ---+
| 1 | 简单 | | 网站内容 | 参考 | 状态,内容类型 | 内容类型 | 3 | 常量 | 第696章 使用哪里;使用文件排序 | | |
+----+-------------+--------+--------------+------+ --------------------+-------------+-----+--------+- --------+-----------------------------+------+---- ---+

被广泛使用的查询:

EXPLAIN SELECT DISTINCT Variabele2
FROM site_content
WHERE contenttype =22
AND STATUS =1
ORDER BY Variabele2 ASC
+----+-------------+--------+--------------+------+ --------------------+-------------+-----+--------+- --------+----------------------------------------- -----+------+------+
| 编号 | 选择类型 | 表| | 类型 | 可能的键 | | 关键 | | key_len | 参考 | 行 | 额外 |
+----+-------------+--------+--------------+------+ --------------------+-------------+-----+--------+- --------+----------------------------------------- -----+------+------+
| 1 | 简单 | | 网站内容 | 参考 | 状态,内容类型 | 内容类型 | 3 | 常量 | 第696章 使用哪里;使用临时的;使用文件排序 | | |
+----+-------------+--------+--------------+------+ --------------------+-------------+-----+--------+- --------+----------------------------------------- -----+------+------+
4

2 回答 2

1

从您给出的唯一查询示例中,Variabele5 和 Variabele6 没有被索引,并且可能有很多 contenttype = 35 的记录,因此查询可能没有非常有效地使用索引。更多查询示例可能有助于我们更好地了解情况。

但是,表大小似乎不是很大,这让我认为缓存的实际重建可能是实际原因。因此,您可能想查看应用程序中使用的缓存策略。我不知道您可以进行多少测试,但我会尝试在关闭缓存的情况下测试您的场景。

于 2012-12-04T09:29:23.003 回答
0

首先,正如您所说,您的数据库一团糟。但是,考虑到您的硬件和相对较小的数据量,我希望查询会非常快。

如果查询速度很慢,可能是因为“where”条件上的通配符 -profiel.title LIKE '%Rem%'例如。您可以将其替换为全文搜索。

另一个设计问题是在数据库中存储二进制文件。根据二进制文件的大小,这会对磁盘 IO 性能产生很大影响,并且 - 通常 - 二进制文件的编码/解码(通常需要数据库连接保持打开)可能比读取文本要慢得多/numbers 从结果集中。考虑在文件系统上缓存二进制文件,并且只有在您知道它们已更改时才为它们访问数据库。

但是,在深入研究数据库之前,我认为您需要找到解决性能问题的方法,这样您就知道您正在解决正确的问题。考虑使用分析器来查找瓶颈,然后处理具体问题。

于 2012-12-04T09:59:17.550 回答