我想利用您对下面的查询思路:查询花费太多时间
select a.expense_code, a.expense_date, a.expense_supplier_code, b.supplier_name, a.expense_discount, a.expense_payment_method, a.expense_payment_transfer_to, a.expense_advance, a.expense_status,
sum(c.expense_item_buy_price * c.expense_item_quantity) , d.account_name, a.expense_counter, a.expense_type, a.expense_saving_type, a.expense_payment_transfer_from
from expense_data a, supplier_data b, expense_item c, tree_data d
where a.expense_supplier_code = b.supplier_code and a.expense_payment_transfer_to= d.account_code
and a.expense_counter = c.expense_counter
and a.expense_date between '2013-01-01' and '2014-01-01' and a.expense_status = 0 or a.expense_status = 2 group by (a.expense_counter);
这个查询花费如此多的时间,即使在EXPENSE_DATA表中,有四个指标:
1- Expense_code.
2- expense_user_id
3- expense_supplier_code
4- expense_payment_transfer_from
我不知道为什么需要这么多时间是因为两次连接太多或者是因为太多的连接。你能建议吗?
你看看运算符优先级了吗?并具有比或更高的优先级。最后,你写'a.expense_status = 0或a.expense_status = 2'。我认为这应该在括号中,或者你应该把它改成'(0,2)'中的'a.expense_status',除非你实际上意味着任何具有状态2的行应该被返回,而不管其他条件如何。 – GolezTrol
运行'EXPLAIN EXTENDED'+ YourQuery代码;并将结果发布到上面的问题中,否则我们不知道表的大小,类型,索引是否用于执行查询等。 – cerd
不要忘记使用执行计划。 –