【问题标题】:Mysql query taking too much timeMysql查询花费太多时间
【发布时间】:2012-09-03 03:44:19
【问题描述】:

我遇到了与 mysql 数据库相关的问题。我是 linux 网络服务器管理员,我面临 mysql 查询的问题。数据库非常小。我尝试在日志中进行跟踪,发现查询至少需要 5 秒才能响应。网站的第一页来自数据库。客户正在使用 cms。当服务器获得一定数量的命中时,数据库服务器开始非常缓慢地给出响应,等待时间从 5 秒增加到几秒。

我检查了慢查询日志

{
Query_time: 11.480138  Lock_time: 0.003837 Rows_sent: 921  Rows_examined: 3333

SET timestamp=1346656767;
SELECT `Tender`.`id`,
    `Tender`.`department_id`,
    `Tender`.`title_english`,
    `Tender`.`content_english`,
    `Tender`.`title_hindi`,
    `Tender`.`content_hindi`,
    `Tender`.`file_name`,
    `Tender`.`start_publish`,
    `Tender`.`end_publish`,
    `Tender`.`publish`,
    `Tender`.`status`,
    `Tender`.`createdBy`,
    `Tender`.`created`,
    `Tender`.`modifyBy`,
    `Tender`.`modified`
FROM `mcms_tenders` AS `Tender`
WHERE `Tender`.`department_id` IN ( 31, 33, 32, 30 );
}

日志中的每一行都是相同的,只是查询时间有差异。 有没有办法调整性能?

更新:这是EXPLAIN 结果:

+----+-------------+--------+------+---------------+------+---------+------+-‌-----+-------------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+------+---------------+------+---------+------+----‌​--+-------------+
| 1  | SIMPLE      | Tender | ALL  | NULL          | NULL | NULL    | NULL | 3542 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+----‌​--+-------------+
1 row in set, 1 warning (0.00 sec) 

客户说他们正在使用索引,所以我运行命令来检查索引。

我得到以下输出。这是否意味着他们正在使用索引。

+--------------+------------+---------+------- -------+-------------+------------+------------+--- -------+--------+------+------------+---------+ |表 |非唯一 |键名 | Seq_in_index |列名 |整理 |基数|子部分 |包装 |空 |索引类型 |评论 | +--------------+------------+----------+--------- ----+-------------+------------+-------------+-- -----+--------+------+------------+---------+ | mcms_tenders | 0 |初级 | 1 |编号 |一个 | 4264 |空 |空 | | BTREE | | +--------------+------------+----------+--------- ----+-------------+------------+-------------+-- -----+--------+------+------------+---------+

【问题讨论】:

  • 尝试使用 EXPLAIN 并检查查询是否使用索引等。
  • 改用EXPLAIN EXTENDED。为您提供更多信息。
  • @j0nes@Rene Pot+----+-------------+--------+------+-- ----------+------+---------+------+------+----- --------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+------+-------------- -+--------+---------+------+------+-------------+ | 1 |简单 |招标 |全部 |空 |空 |空 |空 | 3542 |使用位置 | +----+-------------+--------+------+-------------- -+------+---------+------+------+-------------+ 1 行设置,1 个警告(0.00 秒)
  • @j0nes @Rene Pot 非常感谢您的帮助

标签: mysql


【解决方案1】:

像这样调整查询性能的常规方法是在 department_id 上创建索引。

但是,这假定 Tenders 实际上是一个表而不是一个视图。您应该确认这一点,因为问题可能在视图中。

此外,根据您的描述,问题可能是从服务器到最终用户的连接。我会尝试在服务器上本地运行查询(或在服务器上严格检查执行时间),看看查询是否真的需要那么长时间。

【讨论】:

  • @戈登林诺夫。如果我在本地服务器上运行它需要同样的时间。虽然我增加了查询缓存大小。它解决了这个问题。此外,我会告诉客户尽可能使用索引。非常感谢
【解决方案2】:

"当服务器获得一定数量的命中时"

定义“某个数字”。当使用更频繁时,读取数据库会更慢是有道理的。此外,MySQL 有一个查询缓存,当对数据进行更改时,它会完全失效。所以每次有人在这张表中插入、删除或修改一条记录,接下来的查询都会变慢,因为该表的日期还没有被缓存。

但是像这样的查询需要 11 秒非常慢,所以要么负载太高,要么硬件不足或损坏,要么你的数据库缺少索引(我总是忘记一开始提到,因为我假设添加索引到是任何使用数据库的人的第二天性)。

【讨论】:

  • 数字从 253 到 521 不等。如果我检查进程列表,所有正在运行的查询都是一样的,就像我粘贴在任何查询中没有差异一样。我不知道为什么 mysql 查询缓存不起作用。可以确定没有人在修改,只有选择查询在工作。由于我不是开发人员,请您建议我们具体可以做什么
  • @GolezTrol 硬件不错,它的配置是 48 核 cpu 和 64 GB RAM。尽管其他共享主机站点的其他数据库运行良好。
  • 共享主机让它变得艰难。可能是在该服务器上运行的一百万个数据库。你怎么知道的?但首先检查索引。他们查询本身很简单,但是由于您在where 子句中使用department_id,因此该列上的索引可能会严重加快查询速度。只有在不能解决问题的情况下才开始寻找其他地方。
  • @Golez 查询 cahe 已启用,但设置为 0 。我将大小增加到 2gb,它对我有用。感谢您的帮助和提示。
猜你喜欢
  • 2018-01-08
  • 2022-06-22
  • 1970-01-01
  • 2018-01-10
  • 2012-06-04
  • 2019-11-14
  • 2013-07-11
  • 2017-09-24
相关资源
最近更新 更多