我有一个用户的数据等级架构的小草图:
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万条记录:< / p>
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
如何调整此架构并以性能方式查询评级?你看到了什么弱点?
正好感谢你的帮助,同事们!
答案 0 :(得分:0)
你最终会有多少行?
这是一个经典的多对多关系表,对吗?它不会起作用,而且效率非常低。将其更改为:
CREATE TABLE user_rank (
user_id int not null,
rank_id int not null,
PRIMARY KEY(user_id, rank_id),
INDEX(rank_id, user_id)
) ENGINE=InnoDB;
(如果愿意,可以重新添加FOREIGN KEY。)
在rank
中,您同时拥有rank_id
和level
。如果level
在表中是唯一的,请将其设为PRIMARY KEY并删除rank_id
(并更改对rank_id
的其他引用)。
这些更改应该可以为您提供数百万行。
如果用户没有多个级别,那么摆脱表格!只需将level
放入user
表(并删除rank_id
)。