首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免FileSort时使用左联接+订单?

如何避免FileSort时使用左联接+订单?
EN

Stack Overflow用户
提问于 2016-03-10 03:25:13
回答 2查看 1K关注 0票数 0

mysql-5.6.24-win32.1432006610

我有两个简单的表,TUser(id, name)TMessage(id, uid, message)TUser保存用户,TMessage保存用户消息。

SQL如下所示,也请参阅:http://sqlfiddle.com/#!9/7f099

代码语言:javascript
复制
CREATE TABLE TUser(
    id     INT UNSIGNED     PRIMARY KEY    NOT NULL    AUTO_INCREMENT,
    name   VARCHAR(128) NOT NULL
);


CREATE TABLE TMessage(
    id      INT UNSIGNED    PRIMARY KEY    NOT NULL    AUTO_INCREMENT,
    uid     INT UNSIGNED    NOT NULL,
    message VARCHAR(256)    NOT NULL
);


CREATE INDEX TMessageIndexUid ON TMessage(uid);

插入一些数据:

代码语言:javascript
复制
INSERT INTO TUser (name) VALUES 
     ('jack')
    ,('rose')
    ,('peter');


INSERT INTO TMessage(uid, message) VALUES
     (1, 'Hello jack')
    , (1, 'Jack, how are you')
    , (1, 'Good morning jack')
    , (2, 'I love you, rose')
    , (3, 'Peter, please call back')
    , (3, 'What are you doing, Peter');

当我运行以下左JOIN + ORDER查询时,FileSort在解释结果中显示:

代码语言:javascript
复制
EXPLAIN
SELECT *
  FROM        TUser
  LEFT JOIN   TMessage 
  ON          TUser.id=TMessage.uid
  WHERE       TUser.id=3
  ORDER BY    TMessage.id DESC;



id  select_type table    type  possible_keys    key              key_len ref   rows Extra
1   SIMPLE      TUser    const PRIMARY;         PRIMARY          4       const 1    Using temporary; Using filesort
1   SIMPLE      TMessage ref   TMessageIndexUid TMessageIndexUid 4       const 2 \N

有什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-10 03:42:57

文件的引入顺序如下:

代码语言:javascript
复制
mysql> EXPLAIN
    -> SELECT *
    ->   FROM        TUser
    ->   LEFT JOIN   TMessage
    ->   ON          TUser.id=TMessage.uid
    ->   WHERE       TUser.id=3
    ->   ORDER BY    TMessage.id DESC;
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+---------------------------------+
| id | select_type | table    | partitions | type  | possible_keys    | key              | key_len | ref   | rows | filtered | Extra                           |
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+---------------------------------+
|  1 | SIMPLE      | TUser    | NULL       | const | PRIMARY          | PRIMARY          | 4       | const |    1 |   100.00 | Using temporary; Using filesort |
|  1 | SIMPLE      | TMessage | NULL       | ref   | TMessageIndexUid | TMessageIndexUid | 4       | const |    4 |   100.00 | NULL                            |
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+---------------------------------+
2 rows in set, 1 warning (0.00 sec)

mysql> EXPLAIN
    -> SELECT *
    ->   FROM        TUser
    ->   LEFT JOIN   TMessage
    ->   ON          TUser.id=TMessage.uid
    ->   WHERE       TUser.id=3;
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+-------+
| id | select_type | table    | partitions | type  | possible_keys    | key              | key_len | ref   | rows | filtered | Extra |
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | TUser    | NULL       | const | PRIMARY          | PRIMARY          | 4       | const |    1 |   100.00 | NULL  |
|  1 | SIMPLE      | TMessage | NULL       | ref   | TMessageIndexUid | TMessageIndexUid | 4       | const |    4 |   100.00 | NULL  |
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+-------+
2 rows in set, 1 warning (0.00 sec)

由于order是在左联接结果上操作的,所以我不知道如何避免这个文件。

如果将左连接更改为内部连接是可以接受的,那么这可能是一种绕过的方法,同时丢失了一些与TMessages不匹配的用户信息。

代码语言:javascript
复制
mysql> EXPLAIN
    -> SELECT *
    ->   FROM        TUser
    ->   INNER JOIN   TMessage
    ->   ON          TUser.id=TMessage.uid
    ->   WHERE       TUser.id=3
    ->   ORDER BY    TMessage.id DESC;
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+-------------+
| id | select_type | table    | partitions | type  | possible_keys    | key              | key_len | ref   | rows | filtered | Extra       |
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | TUser    | NULL       | const | PRIMARY          | PRIMARY          | 4       | const |    1 |   100.00 | NULL        |
|  1 | SIMPLE      | TMessage | NULL       | ref   | TMessageIndexUid | TMessageIndexUid | 4       | const |    2 |   100.00 | Using where |
+----+-------------+----------+------------+-------+------------------+------------------+---------+-------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)
票数 1
EN

Stack Overflow用户

发布于 2016-03-10 03:40:48

我也不知道“filesort”。然后我发现了一些事情,

代码语言:javascript
复制
"Anytime a sort can’t be performed from an index, it’s a filesort."

以下是参考的链接:

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35907004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档