0

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

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 时发生的行时,这值得我获得的收益吗?一个小时将有大约2500 万次选择。

4

3 回答 3

2

过早优化如果万恶之源。当您拥有实际性能数据时,首先进行清晰设计,然后进行优化。

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

恐怕如果我插入一行并且每次插入都必须查找城市 FK 和国家 FK,我可能会损失很多速度?

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

  • 这将导致更少的磁盘写入
  • 你有一个MyISAM表;所以它没有 FK 支持,也不做任何外键查找/检查
  • 用整数替换 varchar 列会将表格置于固定长度行格式,这可能比动态长度格式更快

以真实数据/工作负载为基准,看看去规范化是否真的值得。

于 2013-05-20T19:14:57.473 回答
1

db 标准化存在是有原因的。
使用一个城市表,一个国家表,并通过 FK 将它们与您的主表连接起来。
另外,您知道哪个国家/地区的名称中有 100 个字符?
您知道哪个城市的名称中有 175 个字符?
ID 可以是 bigint,但您确定需要 BIGINT(20),INT(11) 不够吗?无论如何,AUTOINCREMENT它和不UNIQUE它,它没有任何意义。
此外,您对每一列都有索引,但没有复合索引。这是错误的,原因有很多。不要pre-index,但索引取决于您的查询。用于explain查看要索引的内容。
此外,不要害怕使用复合索引并避免为您拥有的每一列创建索引。
完成上述所有步骤,您将获得快速查询(至少希望如此)

于 2013-05-20T19:17:19.733 回答
1

City 和 Country 表会比较小(相对而言),并且可能很适合内存,因此查找速度会很快。

如果这还不够快,请尝试缓存查找客户端(即您的 php 应用程序)。

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

尝试先对其进行标准化,它可能会足够快。

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

于 2013-05-20T19:18:34.813 回答