将数据拆分为两个表

时间:2013-05-20 19:06:09

标签: php mysql sql database

我想用这个信息创建一个表:

ID bigint(20) PK AI
FID bigint(20) unique
points int(10) index 
birthday date index 
current_city varchar(175) index 
current_country varchar(100) index 
home_city varchar(175) index 
home_country varchar(100) index 
Engine = MyISAM

在学校我了解到:在插入数据时,创建2个额外的表,一个包含城市,一个包含国家,FK到该表。我怀疑的原因是:

此表格将在 10M 周围插入一小时。我担心如果我插入一行并且必须在每次插入时查找城市FK和国家FK,我可能会失去很多速度?当我选择仅在WHERE ID = id时发生的行时,这是值得的。这些选择一小时左右会有 25M

3 个答案:

答案 0 :(得分:2)

过早优化如果万恶之源。如果您有实际的性能数据,请先干净地设计,然后进行优化。

干净的设计将是一个适当规范化的表格,即具有单独的城市和国家/地区表格。

  

我担心如果我插入一行并且必须在每次插入时查找城市FK和国家/地区FK,我可能会失去很多速度?

实际上,在varchar列中仅插入小ID而不是原始国家/城市名称可能会更有效:

  • 这将导致更少的磁盘写入
  • 您有 MyISAM 表格;所以它没有FK支持,不进行任何外键查找/检查
  • 使用整数替换varchar列会将表格放在 fixed-length rows format 中,这可能比动态长度格式更快

使用真实数据/工作负载进行基准测试,看看是否真的值得去标准化。

答案 1 :(得分:1)

存在db归一化的原因 使用表格用于城市,一个用于国家/地区,并通过FK将其与主表格连接 另外,你知道哪个国家的名字有100个字符?
你知道哪个城市名字中有175个字符?
ID可以是bigint,但是你确定你需要一个BIGINT(20),INT(11)是不是足够了?无论如何,AUTOINCREMENT它,而不是UNIQUE它,它没有任何意义 此外,每列都有索引,但没有复合索引。出于这么多原因,这是错误的。不要pre-index,而是根据您的查询编制索引。使用explain查看要编入索引的内容 此外,不要害怕使用复合索引,并避免为每个列创建索引 执行上述所有步骤,您将获得快速查询(至少让我们希望)

答案 2 :(得分:1)

City和Country表格很小(相对),可能在内存中很好,所以查找速度很快。

如果速度不够快,请尝试缓存查找客户端(即您的php-app)。

由于您的行将更小(int而不是varchar),您可以在每个页面上放置更多行,从而使索引查找更快。

首先尝试将其标准化,它可能足够快。

确保使用InnoDB而不是MyISAM。它有更好的锁定,你的应用程序看起来非常并发。