改进mysql查询?

时间:2012-05-04 14:37:33

标签: mysql

我的尝试是加入客户和订单表并加入lineitem和订单表。我还索引了c_mktsegment字段。我的结果是这个。有什么我可以做的改进吗?

select
    o_shippriority,
    l_orderkey,
    o_orderdate,
    sum(l_extendedprice * (1 - l_discount)) as revenue
from
    cust As c
    join ord As o on c.c_custkey = o.o_custkey
    join line As l on o.o_orderkey = l.l_orderkey
where
    c_mktsegment = ':1'
    and o_orderdate < date ':2'
    and l_shipdate > date ':2'
group by
    l_orderkey,
    o_orderdate,
    o_shippriority
order by
    revenue desc,
    o_orderdate;

1 个答案:

答案 0 :(得分:2)

我没有看到任何明显错误的查询。为了获得良好的性能,您可能应该在orders.o_custkey和lineitem.l_orderkey上有索引。 c_mktsegment上的索引将让DB快速查找客户记录,但从那里您需要能够找到订单和lineitem记录。

您应该执行解释以查看数据库如何处理查询。这取决于许多因素,包括每个表中的记录数和密钥分布,所以我不能通过查看查询来说出计划是什么。但是如果你运行Explain并看到它正在对表进行完整文件读取,那么你应该添加一个索引来防止这种情况发生。对于查询优化而言,这几乎就是规则#1。