MySQL优化-使用索引

时间:2018-06-29 18:57:34

标签: mysql optimization indexing

我在表a上具有以下索引:

SHOW INDEX FROM a
  

表,非唯一,键名,Seq_in_index,列名,排序规则,基数,子部分,压缩,空,Index_type,注释,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 个答案:

答案 0 :(得分:1)

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

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

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

(tteci, OC_ID) 

对于表a的OC_ID索引已足够