【问题标题】:SQL: Ideal engine type (MyISAM vs InnoDB) and data type for unique text columnSQL:理想的引擎类型(MyISAM vs InnoDB)和唯一文本列的数据类型
【发布时间】:2011-08-24 22:33:34
【问题描述】:

您好,我有一个使用 mysql 的 php 网站,并且我有一个表,其中有一列名为“名称”。 我打算让它具有以下功能:

  • 它应该是 varchar(N) 类型,就像常规名称一样。
  • 它可能很长,但绝不应该包含所谓的“描述”,因为那是在另一个我不关心搜索的字段中。 (也许在将来,我什至可能把它放在另一张桌子上)
  • 它必须是唯一且可搜索的,这似乎使它成为一个合适的候选主键。
  • 搜索是简单的类型,只是像 mysql LIKE %keyword% 这样的行为。
  • 此表(非常)经常读取,每隔一段时间插入新行,很少删除/更新行。
  • 许多其他表引用此表上的值,理想情况下我希望在其他表上有外键约束,这导致我想要使用 InnoDB。

我的问题是,我应该对这个表使用 MyISAM 还是 InnoDB?考虑到读取频率/使用的内存量/互联网上针对 varchar 主键的警告量,我的不太长的 varchar 也可以用作主键吗?

但是我真的想从 InnoDB 提供的外键约束中受益,还是我应该只在 php 级别担心它?

我特别关心的是 MyISAM 的全文搜索功能。我试图阅读官方 mysql 网页以了解它的用途,但未能理解到足以判断我的情况是否会从中受益。

【问题讨论】:

    标签: mysql search indexing unique varchar


    【解决方案1】:

    简答:具有代理主键的 InnoDB。

    更长的答案

    由于您希望具有Name 列的表具有许多子表,因此我建议使用INT UNSIGNED 的代理键(如果您的数据允许,甚至可以使用BIGINT UNSIGNED)。这样一来,您的所有子表都不需要在其中包含 Name 列,从而节省空间。

    在 InnoDB 中,短主键是最好的选择,因为主键包含在所有二级索引中:http://dev.mysql.com/doc/refman/5.1/en/innodb-index-types.html

    FULLTEXT 索引不需要进行简单的LIKE('%keyword%') 匹配。如果您对自然语言匹配感兴趣(但未将其作为要求),它们会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2012-04-08
      • 2012-05-15
      • 2012-03-01
      • 2010-12-10
      相关资源
      最近更新 更多