mysql-5.6.24-win32.1432006610
我有两个简单的表,TUser(id, name)和TMessage(id, uid, message)。TUser保存用户,TMessage保存用户消息。
SQL如下所示,也请参阅:http://sqlfiddle.com/#!9/7f099
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);插入一些数据:
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在解释结果中显示:
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有什么问题吗?
发布于 2016-03-10 03:42:57
文件的引入顺序如下:
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不匹配的用户信息。
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)发布于 2016-03-10 03:40:48
我也不知道“filesort”。然后我发现了一些事情,
"Anytime a sort can’t be performed from an index, it’s a filesort."以下是参考的链接:
https://stackoverflow.com/questions/35907004
复制相似问题