我们为我们的客户管理一个网站,该网站正在处理严重的性能问题。该网站是在 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章 使用哪里;使用临时的;使用文件排序 | | | +----+-------------+--------+--------------+------+ --------------------+-------------+-----+--------+- --------+----------------------------------------- -----+------+------+