MySQL优化 - 使用索引

我在表a上有以下INDEX:

SHOW INDEX FROM a

Table,Non_unique,Key_name,Seq_in_index,Column_name,Collation,Cardinality,Sub_part,Packed,Null,Index_type,Comment,Index_comment a,'1','oc_id','1','OC_ID','A','19 ',NULL,NULL,'YES','BTREE','',''

并且 explain 计划显示它正在被使用:

EXPLAIN SELECT * FROM a
WHERE OC_ID IN (
                5841)

'1', 'SIMPLE', a, 'ref', 'oc_id,oc1', 'oc_id', '6', 'const', '121080', 'Using where'

但是使用子查询它没有使用:

EXPLAIN SELECT * FROM a
WHERE OC_ID IN (SELECT OC_ID FROM b WHERE tteci = "54301")

'1', 'PRIMARY', a, 'ALL', NULL, NULL, NULL, NULL, '701145408', 'Using where'
'2', 'DEPENDENT SUBQUERY', b, 'index_subquery', 'OC_ID,tteci1', 'OC_ID', '6', 'func', '1', 'Using where'

我究竟做错了什么?

回答(1)

2 years ago

为了获得更好的性能,您可以使用连接而不是基于子选择结果的IN子句

SELECT * 
FROM a
INNER  JOIN b ON a.OC_ID = b.OC_ID and b.tteci =  "54301"

对于索引,您应该使用与JOIN子句中涉及的列的复合索引,例如对于表b:

(tteci, OC_ID)

对于表,OC_ID索引就足够了