【问题标题】:How to optimize IN subquery in MySQL?如何优化 MySQL 中的 IN 子查询?
【发布时间】: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)

【问题讨论】:

    标签: mysql query-optimization subquery


    【解决方案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”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多