如何优化 MySQL 中的 IN 子查询?
Posted
技术标签:
【中文标题】如何优化 MySQL 中的 IN 子查询?【英文标题】:How to optimize IN subquery in MySQL? 【发布时间】:2010-11-07 15:43:10 【问题描述】:我的查询似乎与来自http://dev.mysql.md/doc/refman/5.1/en/in-subquery-optimization.html 的示例非常相似,但不幸的是,本手册的收据对我不起作用。
当我单独运行它们时,内部和外部查询都使用索引,但是当我运行整个查询时,外部查询会扫描整个表...
mysql> 解释 select smsId FROM SMSDelivery WHERE smsId IN (SELECT smsId FROM SMS WHERE phoneNumber='123456' OR fromUser='5678p' OR toUser='5124p') \G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: SMSDelivery
type: index
possible_keys: NULL
key: FK75C784D70BE5EC9
key_len: 4
ref: NULL
rows: 1337017
Extra: Using where; Using index
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: SMS
type: unique_subquery
possible_keys: PRIMARY,phoneNumber,fromUser,toUser
key: PRIMARY
key_len: 4
ref: func
rows: 1
Extra: Using where
2 rows in set (0.00 sec)
【问题讨论】:
【参考方案1】:你可以试试这个:
EXPLAIN
SELECT
sd.*
FROM
SMSDelivery sd
INNER JOIN
(
SELECT smsId FROM SMS WHERE phoneNumber='123456' OR fromUser='5678p' OR toUser='5124p'
) s ON sd.smsId = s.smsId;
【讨论】:
非常感谢 - 内连接使用索引,而不是表扫描! 您也可以使用“EXISTS”而不是“IN”以上是关于如何优化 MySQL 中的 IN 子查询?的主要内容,如果未能解决你的问题,请参考以下文章