我有一个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秒,所以它不是缓存......)
注意:我在带有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
我按照评论中的要求运行了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
因此只显示主要索引,这还不足以作为索引吗?
答案 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
。您还必须在该列上定义索引。