2

我有一个带有 INNER JOIN 的简单查询。连接的表有 1500 和 2500 行。两个表都有一个主键。未在此键上完成连接。

此查询的结果集有 1500 行。当我运行此查询时,它需要 20 秒......(永恒

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. 有没有一种快速的方法来找出这个查询有多少行?

注意:我使用 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 使用 where;使用临时的;使用文件排序
1 SIMPLE 所以 ALL NULL NULL NULL NULL 2529 使用 where

  • 更新 2:

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

payment_id - int(11) NO PRI auto_increment
时间戳 - 时间戳 NO CURRENT_TIMESTAMP   
order_code - varchar(100)NO         
接受 - varchar(50) 否         
金额 - varchar(20) 否          

所以只显示一个主索引,这还不够索引吗?

4

1 回答 1

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在这种情况下没有使用的列上,因为连接使用的是 column order_code。您还必须在该列上定义一个索引。

于 2013-01-12T12:25:23.347 回答