如何优化mysql查询

Posted

技术标签:

【中文标题】如何优化mysql查询【英文标题】:how to optimise mysql queries 【发布时间】:2012-09-22 08:32:56 【问题描述】:

我从我的网络托管公司收到通知,以优化我的网站中的 mysql 查询。他们告诉我,共享托管中不允许运行超过 15 秒的 MySql 查询,而该域的 mysql 查询运行超过 15 秒75 秒。

但我不知道该做什么以及在哪里更改以优化 MySQL 查询。请帮我解决这个问题。

用户@主机:khabarin_suprusr[khabarin_suprusr] @ localhost [] Query_time: 76.546533 Lock_time: 1.408959 Rows_sent: 5 Rows_examined: 3038

use khabarin_portal3;
SET timestamp=1347378163;
SELECT *
FROM (`art_conts`)
JOIN `art_cats` ON `art_cats`.`cat_id`=`art_conts`.`cat_id`
JOIN `art_secs` ON `art_secs`.`sec_id`=`art_cats`.`sec_id`
WHERE `art_conts`.`cont_status` = 'public'
ORDER BY `cont_id` desc
LIMIT 5;

User@Host: khabarin_suprusr[khabarin_suprusr] @ localhost []**strong text Query_time: 54.002604 Lock_time: 1.403354 Rows_sent: 1 Rows_examined: 3033**

use khabarin_portal3;
SET timestamp=1347376289;

用户@主机:khabarin_suprusr[khabarin_suprusr] @ localhost [] Query_time: 24.436448 Lock_time: 13.889496 Rows_sent: 1 Rows_examined: 0

use khabarin_portal3;
SET timestamp=1347376151;
SELECT COUNT(*) AS `numrows`
FROM (`art_conts`)
JOIN `art_cats` ON `art_cats`.`cat_id`=`art_conts`.`cat_id`
JOIN `art_secs` ON `art_secs`.`sec_id`=`art_cats`.`sec_id`
WHERE `art_conts`.`cat_id` = '59'
AND `art_conts`.`cont_status` = 'public'
ORDER BY `cont_id` desc;

【问题讨论】:

【参考方案1】:

一个好的开始是在您的 SELECT 语句前面使用关键字“EXPLAIN”。

大多数时候存在不正确或未使用的索引。

如果可能,请避免在语句中使用“*”,并仅选择您真正需要的行和列。

【讨论】:

"如果可能,请避免语句中的“*”,并仅选择您真正需要的行。"这是神话,不是真的。 *没有错 EXPLAIN 是一个好的开始。之后将索引放在键上.. 然后根据需要转移到专用/VPS 是否有可能从我的数据库中删除一些数据以减小其大小。之后,这个问题将得到解决。我也不知道为什么会出现这个问题。【参考方案2】:

尝试在 art_conts 上建立索引,如下所示:

cont_id desc,
cont_status,
cat_id,
sec_id

【讨论】:

在运行查询之前和之后选择 now()

以上是关于如何优化mysql查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何优化以下语句,查询耗时太久了?

php+mysql 如何优化千万级数据模糊查询加快

如何迭代优化 MySQL 查询?

如何优化 mysql 查询

mysql多条件查询的优化

如何优化 mysql 查询