查询时间超过两秒
Posted
技术标签:
【中文标题】查询时间超过两秒【英文标题】:Query takes more than two seconds 【发布时间】:2016-04-27 19:50:29 【问题描述】:我有一个超过 2 秒的查询。
这是我的表架构:
CREATE TABLE `vouchers` (
`id` int(11) NOT NULL,
`voucher_dealer` int(11) NOT NULL,
`voucher_number` varchar(20) NOT NULL,
`voucher_customer_id` int(11) NOT NULL,
`voucher_date` date NOT NULL,
`voucher_added_date` datetime NOT NULL,
`voucher_type` int(11) NOT NULL,
`voucher_amount` double NOT NULL,
`voucher_last_debt` double NOT NULL,
`voucher_total_debt` double NOT NULL,
`voucher_pay_method` int(11) NOT NULL,
`voucher_note` text NOT NULL,
`voucher_inserter` int(11) NOT NULL
)
主键是id
,并且是自动递增的。
该表有超过 100 万行。
查询如下所示:
select *
from vouchers
where voucher_customer_id = **
and voucher_date between date and date
有时它看起来像这样:
select sum(voucher_amount)
from vouchers
where voucher_customer_id=**
and voucher_date> date limit 1
有没有办法加快我的查询速度?
【问题讨论】:
您在voucher_customer_id
和voucher_date
上有索引吗?如果该列已编入索引,则使用该列查找数据会快得多。
由于您总是查询相同的两个字段,因此组合索引将大大加快处理速度:在 ...id 和 ...date 上设置两个不同的索引并没有太大帮助。
非常非常感谢你......现在它的粘性不到 0.05 秒再次感谢你
【参考方案1】:
您需要使用 mysql 的“EXPLAIN”来确定发生了什么以及为什么。
http://dev.mysql.com/doc/refman/5.7/en/explain.html
为此,只需在您的陈述之前添加“EXPLAIN”,如下所示:
EXPLAIN select *
from vouchers
where voucher_customer_id = **
and voucher_date between date and date
它将为您提供有关可用键的信息,需要搜索多少行......等等。
您可以使用该信息来确定它运行缓慢的原因以及如何提高它的速度。
运行它后,您可以使用许多在线资源中的任何一种来解释(不是双关语)如何使用“EXPLAIN”结果。以下是一些:
http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/
How to optimise MySQL queries based on EXPLAIN plan
https://www.digitalocean.com/community/tutorials/how-to-optimize-queries-and-tables-in-mysql-and-mariadb-on-a-vps
【讨论】:
【参考方案2】:为凭证_日期创建另一个索引
【讨论】:
这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review @chris,对不起,克里斯,但我认为这是一个答案,而且我认为这是正确的答案,另一方面,这不是批评,我不要求澄清。也许这听起来很“粗鲁”,因为它很短,但这不是我的本意,英语不是我的母语。以上是关于查询时间超过两秒的主要内容,如果未能解决你的问题,请参考以下文章
页面响应时间超过两秒,cpu爆满,内存超过75%,nginx的access日志中出现ab攻击