【发布时间】:2015-02-25 15:24:26
【问题描述】:
我有一个用户等级数据模式的小草图:
CREATE TABLE user
(
user_id int auto_increment primary key,
nickname varchar(50),
details varchar(30)
);
CREATE TABLE rank
(
rank_id int auto_increment primary key,
level int,
type varchar(20)
);
CREATE TABLE user_rank
(
user_id int auto_increment not null,
rank_id int auto_increment not null,
FOREIGN KEY (user_id) REFERENCES user(user_id),
FOREIGN KEY (rank_id) REFERENCES rank(rank_id),
);
INSERT INTO user
(nickname, details)
VALUES
('Horax', 'admin@sqlfiddle.com'),
('Goan', '@sqlfiddle');
INSERT INTO rank
(level, type)
VALUES
(10, 'bronze'),
(15, 'gold');
INSERT INTO user_rank
(user_id, rank_id)
VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 4);
我想选择 (a) N 个评分最高的用户,(b) 在任何时候通过 user_id 快速获取用户昵称和用户详细信息,数据量为 100 万条记录:
SELECT * FROM user_rank LEFT JOIN user ON user_rank.user_id = user.user_id
LEFT JOIN rank ON rank.rank_id = user_rank.rank_id
ORDER by level DESC
LIMIT N
和
SELECT user.nickname, user.details FROM user_rank LEFT JOIN user ON user_rank.user_id = user.user_id
LEFT JOIN rank ON rank.rank_id = user_rank.rank_id
WHERE user.user_id = 10
如何调整此架构和查询以提高性能?你看到了哪些薄弱环节?
感谢您的帮助,同事们!
【问题讨论】:
-
如果您选择的只是基于 user_id 的用户字段,为什么还要在第二个查询中加入任何内容?
标签: mysql sql postgresql relational-database query-optimization