我有以下查询,执行时间超过一分钟,我该如何优化它。由于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
答案 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/