我正在创建一个包含多个longtext行的mysql表。我期待很多用户输入大量文本。我应该将它们分别分成不同的表格,还是将它们放在一张桌子上?我关注速度,当我查询结果时会影响速度,如果我想在未来传输数据怎么样?我正在使用InnoDB,还是应该使用Myisam?
CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
diet longtext NOT NULL,
run longtext NOT NULL,
faith longtext,
apple longtext
);
答案 0 :(得分:1)
如果您的查询是SELECT *
,则您对此数据库布局的速度主要关注,而页面只使用其中一个字段。 (这是一个非常常见的性能降级程序。)此外,如果您打算在可用文本列表中每页显示多个文本,您可能希望有一个单独的描述列(具有截断版本的完整的文本,如果没有别的),并且只获取那些而不是只获取全文,然后在PHP中截断它。
如果您打算提供搜索功能,您绝对应该使用全文索引来保持您的表现。如果您的MySQL版本是5.6.4或更高版本,则可以使用InnoDB和MyISAM进行全文搜索。否则,只有MyISAM在早期版本中提供。
您还可以在一体化表和每个单独表之间进行第三种选择,这可能是首选方式,假设您最终可能会在未来添加更多文本类型。那就是:
有一个第二个表,其中引用了第一个表的ID,一个列(ENUM将是最有效的,但只要你将其编入索引,实际上是一个边缘问题),表明文本的类型(饮食,运行等) 。),以及包含文本的单个longtext列。
然后,您可以毫不费力地在将来添加更多文本类型,而无需对表格布局(或代码)进行更为戏剧性的编辑,并且只获取特定类型的文本也很简单。结合主条目表(可能还包含一些相关元数据,如作者ID,输入日期等)和文本的索引联接不应成为性能问题。