【问题标题】:MySQL optimization - use of indexMySQL优化——索引的使用
【发布时间】:2018-12-09 00:17:01
【问题描述】:

我在表 a 上有以下 INDEX:

SHOW INDEX FROM a

表、Non_unique、Key_name、Seq_in_index、Column_name、排序规则、基数、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'

我做错了什么?

【问题讨论】:

  • 第一步是消除子查询,将其替换为连接(提示:在 OC_ID 上连接 ab,在 tteci 上过滤 b) .然后要么 1)MySQL 将“高兴”并选择所需的索引,要么 2)问题将不同,因为子查询不再相关/不存在。
  • 有些事情没有意义; 提供SHOW CREATE TABLE

标签: mysql optimization indexing


【解决方案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 索引就足够了

【讨论】:

  • (较新版本的 MySQL 会为您进行这种重写在某些情况下。)
  • 我不知道 OP 使用的版本 .. 但在任何情况下都应避免使用带有子选择的 IN 子句 ..
猜你喜欢
  • 2011-09-03
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多