SQL:理想引擎类型(MyISAM vs InnoDB)和唯一文本列的数据类型

时间:2011-05-13 13:08:38

标签: mysql search indexing unique varchar

您好我有一个使用mysql的php网站,我有一个名为'Name'的列表。 我打算让它具有以下功能:

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

我的问题是,我应该将MyISAM或InnoDB用于此表吗?考虑到读取的频率/使用的内存量/互联网上针对varchar主键的警告数量,我的不那么长的varchar也可以用作主键吗?

但我真的想从InnoDB提供的foriegn-key约束中受益,或者我应该在php级别担心它?

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

1 个答案:

答案 0 :(得分: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%')个索引。如果您对自然语言匹配感兴趣,他们会提供帮助,但您没有将其作为要求。