0

我有两张桌子...

表“标签”

+---------+----------+
|  tag    |   id     |
+---------+----------+
|  nancy  |   902    |
+---------+----------+
|  fred   |   903    |
+---------+----------+
|  suzan  |   904    |
+---------+----------+
|  joe    |   905    |
+---------+----------+

和表标签来标记

+---------+----------+
|  tag_a  |   tag_b  |
+---------+----------+
|  903    |   902    |
+---------+----------+
|  905    |   903    |
+---------+----------+
|  902    |   904    |
+---------+----------+
|  904    |   905    |
+---------+----------+

我经常使用带有“tag”表的 INNER JOIN 语句扫描标记以标记关系,以便我可以查询与“nancy”相关的人。我想知道如果将标签名称转储到标签到标签表中而不是加入标签表中以便我可以根据标签名称查找关系,我会做得更好。加入表格对性能有很大影响吗?我标记表的标记在 900k 行范围内。标签表约为 30k。

4

1 回答 1

1

如果您希望存储有关标签的任何元信息,那么无论如何您都需要一个tag表。添加连接确实可能会大大增加查询的费用。

在您的情况下,我建议您考虑以下事项:

  1. 使用 InnoDB
  2. 更改idTagString
  3. 将实际标签放入TagString
  4. Tag使用级联更新/删除创建表的外键

通过这种方式,您可以在单个列上进行分组、过滤等,但如果您需要更多信息,您可以加入Tag表格(或您需要的任何表格)。

当我们达到 80,000,000 条标签记录并在http://tagcloud.com上进行实时连接以生成标签云时,我遇到了一些严重的 MySQL 性能问题……一些缓存确实对此有所帮助,但它似乎仍在推动关系数据库的设计限制(以正常形式)。我们最好使用不同的存储格式,这种格式的写入成本可能更高,但读取速度更快。

于 2012-10-22T16:05:54.390 回答