行设计如何影响MySQL的性能?

时间:2009-09-08 10:19:21

标签: sql mysql performance

  1. 我有一个users表和一些用户可以写的论坛。论坛上的每个操作都使用users表。用户可以拥有一个相当大的配置文件(50KB)。如果我在每行中获得如此大的数据,那么将单独的表与用户的配置文件和其他不经常访问的数据组合起来会不会更快?

  2. 在一个在线RPG游戏中,每个角色都有很长的能力列表,例如:手枪体验,机枪经验,投掷手榴弹经验,还有15个。最好将它们存储在一个字符串中,因为数字用分号分隔 - 这将占用比整数更多的空间,或者我应该为每个能力单个字段制作?或者二进制? (我用c ++)

2 个答案:

答案 0 :(得分:1)

  1. 如果您不需要来自的数据 具体列,不明白。 不要SELECT *而是SELECT a, b,...

  2. 如果您需要进行SQL查询 某些列,例如ORDER BY pistols_experience,你应该 把它放在不同的栏目中。如果 你只是一次展示它 可以序列化不同的 键值对成文本字段 通过YAML,JSON等。

答案 1 :(得分:0)

(1)不是,不是。正如斯特凡所说,你应该只选择你想要的东西,所以在表格中找到你不想要的东西是没有问题的。 50K TEXT blob只是行中的一个指针。

但是,如果您使用的是MyISAM表,则可能会出现问题。在MyISAM中只有表级锁定,因此当您有一个用户更新其行(例如,上次访问时间)时,它会阻止所有其他用户访问该表。在这种情况下,您可能会通过将大量更新的列从相对静态但经过大量选择的列中分离出来来获得一些改进。

但你还是不想使用MyISAM:它有点废话。使用InnoDB,获取行级锁定(以及事务和外键约束),不用担心。今天使用MyISAM表的唯一原因是全文搜索,InnoDB不支持。

(2)您通常会将每个独立值分隔到自己的字段中。如果遇到真正的性能问题并且您不需要自己对值进行数据库级操作,则可以考虑对其进行非规范化,但是您将失去数据库的功能。