2011-01-26 165 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

你期望有多少事件?

有可能是,如果你沒有成千上萬的大型活動,你的表現在任何情況下都會很好。