如何优化此查询,执行时间超过一分钟

时间:2012-03-29 11:41:49

标签: mysql sql

我有以下查询,执行时间超过一分钟,我该如何优化它。由于o.id desc 的顺序,它很慢,如果我删除它,查询执行它几毫秒。


select o.*, per.email, p.name
from order o 
inner join product p 
on o.product_id=p.id 
inner join person per 
on o.person_id=per.id 
order by o.id desc 
limit 100;

以下是解释

的结果

1   SIMPLE  p   index   PRIMARY FK2EFC6C1E5DE2FC    8   NULL    6886    Using index; Using temporary; Using filesort
1   SIMPLE  o   ref FK67E9050121C383DB,FK67E90501FC44A17C   FK67E90501FC44A17C  8   dev.p.id    58  
1   SIMPLE  per eq_ref  PRIMARY PRIMARY 8   dev.o.person_id 1   Using index

所有表都是InnoDB,连接在主键和外键上。除了索引位于中的电子邮件列以及订单

中的状态

每个表中的记录数

人:1,300,000 产品:7,000 订单:70,000

3 个答案:

答案 0 :(得分:1)

计划程序很可能在连接之前没有使用limit提示从订单表中删除行。所以服务器必须为所有行进行连接,然后返回几个。

试试这个:

select o.* from
(select * order order by id desc limit 100) o
inner join product p 
on o.product_id=p.id 
inner join person per 
on o.person_id=per.id 
order by o.id desc limit 100;

编辑:只有在存在约束时才能保证产品和人员表中存在相应的行。

答案 1 :(得分:0)

是的,我理解你的问题,在这种情况下,首先,将你的查询保存在.sql文件中。  您可以在Sql Server Management工作室的“工具”菜单中使用名为“数据库引擎优化顾问”的SQL Server实用程序。

首先打开sql server并转到工具并选择“Database Engine Tuning Advisor”选项。 然后选择您之前存储的文件。 现在勾选您正在使用的数据库和在查询中使用的表 单击主菜单中的“开始分析”。 它向您展示了可能创建的索引和状态 现在将此建议应用于您的查询,转到操作manu并选择“Apply Recommandation”,它将在您的表上创建索引和状态,并减少查询的执行时间。

答案 2 :(得分:0)

增加此变量的值并重新启动MySQL服务器read_rnd_buffer_size 将变量设置为较大的值可以大大提高ORDER BY的性能。

您也可以参考http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/