添加限制加快了mysql查询,为什么?

时间:2013-01-12 12:15:42

标签: php mysql sql

我有一个INNER JOIN的简单QUERY。连接的表有1500 en 2500行。两个表都有一个主键。没有在此密钥上进行连接。

此查询的结果集有1500个。 当我运行此查询时需要20秒......( AN ETERNITY

SELECT so.order_id
FROM   shop_orders so
       INNER JOIN shop_order_payments sop
          ON so.order_code = sop.order_code
WHERE  sop.status = 9
ORDER  BY date_created DESC

当我在结尾添加“LIMIT 1500”时,查询只需1秒。 (当我删除它时,它需要20秒,所以它不是缓存......)

  1. 这是为什么?
  2. 有没有一种快速的方法可以找出这个查询有多少行?
  3. 注意:我在带有mysql()函数的php脚本中运行此查询)

    * update1:​​EXPLAIN的结果

    id   select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
    1   SIMPLE  sop ALL NULL    NULL    NULL    NULL    1153    Using where; Using temporary; Using filesort
    1   SIMPLE  so  ALL NULL    NULL    NULL    NULL    2529    Using where
    
    
    • 更新2:

    我按照评论中的要求运行了DESC

    
    payment_id - int(11)    NO  PRI     auto_increment
    timestamp - timestamp   NO      CURRENT_TIMESTAMP   
    order_code - varchar(100)NO         
    acceptance - varchar(50) NO         
    amount  -  varchar(20)  NO          
    
    

    因此只显示主要索引,这还不足以作为索引吗?

1 个答案:

答案 0 :(得分:1)

EXPLAIN表示查询没有使用索引。因此,它执行全面扫描,导致它变慢。

尝试运行此语句,

ALTER TABLE shop_orders ADD INDEX td_idx (order_code);
ALTER TABLE shop_order_payments ADD INDEX td2_idx (order_code);

再次运行SELECT查询。

更新1

您的表有一个索引,但在payment_id列上,在这种情况下不使用,因为联接使用列order_code。您还必须在该列上定义索引。