从表中分离不经常访问的字段

时间:2013-10-19 10:35:40

标签: mysql database-schema

我目前正在创建一个基本用户注册的网站,并将所有用户数据放在一个名为“users”的表中。该用户在登录时或脚本显示其详细信息时可能需要11个字段,如用户名,角色等。虽然密码,电子邮件,IP等九个字段只有在用户登录时才能访问。如果预计数据库将处理100,000到1,000,000个用户,我是否应该将登录相关字段拆分为名为“users_login”的表以减少主“用户”表的大小?

我知道有很多变量涉及,最好的方法是测试两个版本,但在我这样做之前,我正在征求关于我是否因为某些原因不应该尝试这个问题的建议。感谢

1 个答案:

答案 0 :(得分:1)

另一种不需要拆分表的方法是创建覆盖索引。某些查询的覆盖索引是索引条目本身包含执行查询所需的所有列的覆盖索引,这意味着执行不需要从表本身读取。例如,对于像select role from user where username = ?这样的查询,那么(用户名,角色)的索引就会覆盖。

在您的情况下,覆盖索引将在11个列上,这些列可能是“该用户在登录时需要的,或者在显示其详细信息时由脚本”。您需要在开始时将用作查找键的列(用户ID或用户名或其他内容)放在一起,因此索引将是(用户名,角色和,九,其他,列,使用,频繁) ,同时,记录,在。)

以下是维基百科数据库团队使用此技术在非常相似的情况下获得~10倍加速的示例:Where covering indexes rock