用户评级 - sql架构优化

时间:2015-02-25 15:24:26

标签: mysql sql postgresql relational-database query-optimization

我有一个用户的数据等级架构的小草图:

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

如何调整此架构并以性能方式查询评级?你看到了什么弱点?

正好感谢你的帮助,同事们!

1 个答案:

答案 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_idlevel。如果level在表中是唯一的,请将其设为PRIMARY KEY并删除rank_id(并更改对rank_id的其他引用)。

这些更改应该可以为您提供数百万行。

如果用户没有多个级别,那么摆脱表格!只需将level放入user表(并删除rank_id)。

相关问题