mysql - 如何优化 MySQL 中的 IN 子查询?

标签 mysql query-optimization subquery

我的查询似乎与 http://dev.mysql.md/doc/refman/5.1/en/in-subquery-optimization.html 中的示例非常相似,但不幸的是,本手册中的收据对我不起作用。

当我分别运行它们时,内部和外部查询都使用索引,但是当我运行整个查询时,外部查询会扫描整个表...

mysql> explain 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)

最佳答案

你能试试这个吗:

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;

关于mysql - 如何优化 MySQL 中的 IN 子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4118422/

相关文章:

php - 根据使用 php 检查的复选框从数据库中删除多行

mysql - 子查询选择作为归档

select - JPA - MAX of COUNT 或 SELECT FROM SELECT

php - 我应该使用哪种算法来查找数据库中的相似性?

java - 控制台上的 servlet 错误不会重定向到错误页面

php - 如何在不明确的列名上产生错误消息?

sql - 什么是 MySQL 索引表?

mysql - 优化 MySql 查询

php - MySQL 子查询优化 - where not in(子查询)

用于运行余额校正的 MySql 查询