2011-01-26 121 views
2

我有以下表结构:MySQL查询性能

EVENT_ID(INT) EVENT_NAME(VARCHAR) EVENT_DATE(DATETIME) EVENT_OWNER(INT) 

我需要添加字段EVENT_COMMENTS这应该是一个文本字段或一个非常大的VARCHAR

我有两个地方我查询此表,一个是在页面上列出所有事件(在该页面中我不需要显示event_comments字段)。

另一个页面加载特定事件的所有细节,我需要在其上显示event_comments字段。

我应该为该事件创建一个带有event_id和event_comments的额外表格吗?或者我应该只在当前表中添加该字段?

换句话说,我问的是,如果我在我的表中有一个文本字段,但我不SELECT它,它会影响我的表的查询性能?

回答

2

添加字段到表使其变大主 键连接在一起。

这意味着:

  • 表扫描将花费更多的时间
  • 少记录将放入一个页面,因此到缓存中,从而增加缓存的风险错过

选择但是,加入此字段需要更多时间。

因此,将此字段添加到此表中将会使不选择它的查询运行得更慢,而那些选择它的查询运行得更快。

0

你应该放在同一张桌子上。

+2

我喜欢它,当两个答案说完全相反。 – Pieter888 2011-01-26 14:09:05

+2

我讨厌它,当两个答案说完全相反。 ;-) – 2011-01-26 14:41:52

+3

我(`日期(s)%2 == 0?'love':'hate'`)当两个评论说完全相反时 – 2011-01-26 15:03:58

1

是的,它会影响性能。至少根据昨天发布的this article

据此,如果您不想承受性能问题,最好将它们放在单独的表格中,并在需要时加入它们。

这是相对部分:

试图限制在 一个表中的列的数目。表 中的列太多可以使查询的扫描时间比只有少数几列的查询长得多。另外,如果你有一个包含许多列的表,其中 通常使用,你也浪费 磁盘空间与NULL值字段。 这也适用于可变大小的 字段,如文本或blob,其中 表的大小可能会比需要的大得多 。在这种情况下,你应该 考虑分拆关闭额外 列到不同的表, 上的记录

+0

我不认为太多列是从4到5。此外,问题并未指定在评论中不会有空值。 – 2011-01-26 14:13:05

+0

我不同意这个观点。虽然将表格放大并增加扫描时间是正确的,但只有在索引编制完成时才会发生。当新列没有包含在索引中时 - 我没有看到原因 - 索引大小将保持不变。我甚至不认为缓存/命中率是这方面的一个方面,因为一个独立的表也需要空间,并且还有一个额外的索引...... – 2011-01-26 14:14:54

0

是的,它可能会影响同一张桌子上的其他查询,你应该可以这样做,因为你可能不在乎。

根据引擎的不同,Blob既可以内联(MyISAM),部分关闭页面(InnoDB),也可以完全关闭页面(在某些情况下为InnoDB插件)。

这些有可能减少每页的行数,因此增加IO操作的数量以满足某些查询。

但是,您关心的可能性非常小,所以您无论如何都应该这样做。这张桌子有多少行? 10^9?它们中有多少具有非空值的blob?

0

它不应该太大,但如果您担心性能,您应该始终运行几个benchmarks并在您的查询上运行EXPLAINs以查看真实效果。

0

你期望有多少事件?

有可能是,如果你没有成千上万的大型活动,你的表现在任何情况下都会很好。