【问题标题】:Performance issues mysql databasemysql数据库的性能问题
【发布时间】:2012-11-21 20:59:02
【问题描述】:

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

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

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

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

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章使用哪里;使用临时的;使用文件排序 | | | +----+-------------+--------+--------------+------+ --------------------+-------------+-----+--------+- --------+----------------------------------------- -----+------+------+

【问题讨论】:

  • 如何发布您的查询,在其上发布 EXPLAIN 以显示 MySQL 是如何执行它们的?
  • 请给我们看一下 SQL 语句。
  • 您发布的示例查询在 MySQL 提示符中执行时是否很慢(而不是从 PHP 中执行?)
  • 这取决于服务器上的其他活动,如果进程列表中有更多查询等待,则查询可能需要 10 -20 秒。如果没有其他内容,则在 内执行
  • 如果查询在理想情况下很快,问题可能不是查询本身,更可能是事务使用不当(您使用的是 InnoDB 吗?),或者服务器配置问题 -您是否为 MySQL 分配了足够的内存?

标签: php mysql performance query-optimization database-performance


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回复,这正是我在开始优化不必要的事情之前尝试做的“解决问题”。我会看看你提供的分析器链接谢谢。
【解决方案2】:

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

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

【讨论】:

  • Variabele5 和 Variabele6 确实没有被索引,这是因为此字段的值因内容类型而异。因此对于内容类型 35,我们可以使用索引,但其他内容类型正在使用该字段来处理不同的数据。缓存被删除后,它不会一次全部重建。访问页面后,它会被缓存,因此这并不是一个繁重的过程。内存缓存也是如此。
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多