2012-09-10 284 views
1

我有关于mysql数据库的问题。我是Linux的web服务器管理员,我面临着一个MySQL查询的问题。数据库非常小。我试图跟踪日志,发现查询至少需要5秒才能做出回应。网站的第一页来自数据库。客户正在使用cms。当服务器获得一定数量的命中时,数据库服务器开始非常缓慢地响应并等待时间从5秒增加到几秒。需要太多时间的Mysql查询

我检查慢速查询日志

{ 
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) 

客户是说他们使用的指数,所以我跑的命令检查索引。

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

+ -------------- + ------------ + ---------- + ------ -------- + ------------- ----------- + + ------------ + - -------- + -------- + ------ + ------------ + --------- + |表| Non_unique | Key_name | Seq_in_index | Column_name |整理|基数| Sub_part |包装|空| Index_type |评论| + -------------- + ------------ + ---------- + --------- ----- + ------------- ----------- + ------------- + + ---- ------ + -------- + ------ + ------------ + --------- + | mcms_tenders | 0 | PRIMARY | 1 | id | A | 4264 | NULL | NULL | | BTREE | | + -------------- + ------------ + ---------- + --------- ----- + ------------- ----------- + ------------- + + ---- ------ + -------- + ------ + ------------ + --------- +

+2

尝试使用EXPLAIN并检查查询是否使用索引等。 – j0nes

+0

使用'EXPLAIN EXTENDED'来代替。为您提供更多信息。 –

+0

@ j0nes @ Rene Pot + ---- + ------------- + -------- + ------ + --------- ------ + ------ + --------- + ------ + ------ + ------------ - + | id | select_type |表| |键入| possible_keys |键| key_len | ref |行|额外| + ---- + ------------- + -------- + ------ + ------------- - + ------ + --------- + ------ + ------ + ------------- + | 1 | SIMPLE |招标| ALL | NULL | NULL | NULL | NULL | 3542 |使用where | + ---- + ------------- + -------- + ------ + ------------- - + ------ + --------- + ------ + ------ + ------------- + 1行集,1个警告(0.00秒) – aditya

回答

0

当服务器获得一些命中数

定义“某个数字”。当数据库使用率更高时,读取数据库的速度会更慢。另外,MySQL有一个查询缓存,在对数据进行更改时完全无效。因此,每当有人在此表中插入,删除或修改记录时,下一个查询将会变慢,因为表格日期仍未解压缩。

但是,对于像这样的查询来说,11秒是非常缓慢的,所以无论是负载太高,硬件不足或损坏,或者你的数据库缺乏索引(我总是忘记提及,因为我假设添加索引对于任何使用数据库的人来说都是第二天性)。

+0

数量从253变化到521.if我检查进程列表中所有正在运行的查询都同样喜欢我在任何上面的查询不存在贴。我不知道为什么mysql查询缓存不工作。它肯定没有人正在修改,只有选择查询正在工作。由于我不是开发人员,能否请您提出我们可以做些什么 – aditya

+0

@ GolezTrol硬件很好,因为它的配置是48核心cpu和64 GB RAM。尽管其他共享托管站点的其他数据库运行良好。 – aditya

+0

共享主机让它变得艰难。可能是在该服务器上运行的数百万个数据库。你怎么知道的?但首先检查索引。他们查询本身很简单,但由于在where子句中使用了'department_id',该列上的索引可能会严重加速查询。只有开始寻找其他地方,如果这不能解决问题。 – GolezTrol

1

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

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

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

+0

@ Gordon Linoff。如果我在本地服务器上运行它,同样的时间。尽管我已经增加了查询缓存大小。并解决了问题。另外,我会告诉客户在任何可能的地方使用索引。非常感谢 – aditya