日期:2014-05-16  浏览次数:20707 次

一条SQL语句
SQL一:
SQL code
select co.id,co.user_id,co.buyer_fullname,co.buyer_address_1,co.buyer_address_2,co.item_code,co.quantity,co.notes_to_yourself,co.batch_id,co.sales_record_number,co.buyer_city,co.buyer_state,co.buyer_zip,co.buyer_country,co.TRANSACTION_ID,co.ORDER_ID from confirmed_order co inner join batch_parameters bp on co.batch_id=bp.batch_id and bp.loading_type='READY_TO_SHIP' and bp.status='C' and not exists(select id from op  where op.co_id=co.id)where (co.transaction_id='' or co.order_id='') and co.id>1234560;

SQL二:
SQL code
select co.id,co.user_id,co.buyer_fullname,co.buyer_address_1,co.buyer_address_2,co.item_code,co.quantity,co.notes_to_yourself,co.batch_id,co.sales_record_number,co.buyer_city,co.buyer_state,co.buyer_zip,co.buyer_country,co.TRANSACTION_ID,co.ORDER_ID from confirmed_order co inner join batch_parameters bp on co.batch_id=bp.batch_id and bp.loading_type='READY_TO_SHIP' and bp.status='C' and not exists(select id from op  where op.co_id=co.id)where (co.transaction_id='' or co.order_id='') and co.id>0;


SQL一和SQL二的区别就是最后的条件(co.id>0)

batch_parameters表部分字段如下:
BATCH_ID loading_type status 
  1 'READY_TO_SHIP' C
  2 'PRINTING' F
confirmed_order 表部分字段

id batch_id user_name...用户基本信息等... transaction_id order_id
1 1 jack 可以为空 29994863012
2 1 188314843005 29994863012
3 1 tom 187189083008 可以为空  

op表全部字段
batch_id co_id(confirmed_order表ID) po_id






explain 结果,其他一样,就这两个不一样,共140W条数据
  key_len rows
SQL一 4 160480
SQL二 65 9613

我想请问下,产生这中结果的原因是什么?还有就是能否帮忙看下这条语句如何优化?用union代替or是否正确?

------解决方案--------------------
或许一个索引查找 一个索引扫描
------解决方案--------------------
贴出你的SHOE INDEX, EXPLAIN结果以供分析。