新来者警告! MariaDB(MySQL)v 10.1.26的问题。我有3个表:FRIENDS,POSTS和USERS。
CREATE TABLE USERS(
uid INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(40) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
pwhash VARCHAR(200) NOT NULL,
);
CREATE TABLE FRIENDS(
RID BIGINT AUTO_INCREMENT PRIMARY KEY,
uid1 INT NOT NULL, #user 1
uid2 INT NOT NULL, #user 2
state INT NOT NULL, #status from user1 -> user2
FOREIGN KEY (uid1) REFERENCES USERS(uid),
FOREIGN KEY (uid2) REFERENCES USERS(uid)
);
CREATE TABLE POSTS(
pstid BIGINT AUTO_INCREMENT PRIMARY KEY,
uid INT NOT NULL,
post_text VARCHAR(500) NOT NULL,
time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(uid) REFERENCES USERS(uid)
);
表的以下索引:
CREATE INDEX users_idx1 ON USERS(username);
CREATE INDEX friends_idx1 ON FRIENDS(uid1);
CREATE INDEX friends_idx2 ON FRIENDS(uid2);
CREATE INDEX posts_idx1 ON POSTS(uid);
CREATE INDEX posts_idx2 ON POSTS(time);
我想快速查询朋友最近发布的100条帖子。当前的SQL:
[EXPLAIN EXTENDED] SELECT * FROM (POSTS as p)
JOIN (FRIENDS as f) ON f.uid2 = p.uid AND
f.uid1 = ?(userid for current user)
ORDER BY p.time DESC LIMIT 100;
我的假设是,MySQL将通过索引获取所有朋友uid(f.uid2,其中f.uid = currentuserid),然后使用该索引搜索帖子,使用ORDER BY获取最新信息并将结果限制为100行。但是,当我运行EXPLAIN时:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra
1 | SIMPLE | f | ref | friends_idx1, friends_idx2, uid2 | friends_idx1 | 4 | const | 1 | 100.00 | Using temporary; Using filesort
1 | SIMPLE | p | ref | posts_idx1 | posts_idx1 | 4 | friends.f.uid2 | 1 | 100.00 | --
它表示在对p.time,f.uid1和f.uid2进行索引时使用文件排序和临时。欢迎提供任何帮助,解释或提高性能的建议。预先感谢!
答案 0 :(得分:0)
对于此查询:
SELECT *
FROM POSTS p JOIN
FRIENDS f
ON f.uid2 = p.uid AND
f.uid1 = ?
ORDER BY p.time DESC
LIMIT 100;
此查询的最佳索引很可能是:friends(uid1, uid2)
和posts(uid)
。
为什么MySQL不使用您的索引?这取决于表的统计信息。根据说明,表中的数据很少。因此,索引不会有所作为。如果所有数据都放在单个数据页上,则索引不太可能影响性能。