2017-02-28 54 views
0

例如,我有一個名爲varchar(10)的單個Name列的「NAMES」表;這個表有500行。我還有一個「NAME_COLLECTIONS」表,其中一列爲longtext;在表的單行中,該列包含長度爲5500的字符串。什麼是更快的 - 從n列中取出一列大小爲t的單列,或者從1列中取出列大小爲n * t的列?

SELECT * FROM NAMES WHERE :Name = 'Tom';運行得比SELECT * FROM NAME_COLLECTIONS;慢嗎?

如何增加NAMES中的列數與增加NAME_COLLECTIONS中單個文本的大小會影響性能?

+0

我傾向於猜測其他所有條件都相同,將數據分割成更多的行會在整個表掃描中爲DBMS創建更多的開銷,但很少其他條件相等。無論如何,這是一個很空洞的問題 - 很難想象一個有用的應用程序,其中提出的數據表示同樣適用於語義*。 –

回答

0
SELECT * FROM NAMES WHERE Name = 'Tom'; 

這應該是更快,假設你有一個列的索引(你應該,因爲你似乎試圖獲得最佳性能)。它只需要從索引讀取一行,並且該行將佔用一頁數據。

longtext可能會跨越多頁數據,並且每讀取一個名稱列表將被迫讀取整個集合。

如果你想搜索一個特定的名字,我建議你正確地爲你的數據建模,每行一行。併爲該列創建一個索引。

儘管500行對MySQL來說並不重要。它可能適合內存中緩衝池中的幾個頁面,所以不應該專注於性能,直到獲得更大的數據集。

順便說一句,您的語法WHERE :Name = 'Tom'是不正確的。帶有冒號前綴的列名似乎是一個命名參數佔位符,而不是列名。參數佔位符只能是固定的字符串,而不能是列的名稱。

+0

對不起,我的意思是寫Name =:Name;這很晚了,我很累。無論如何感謝您的答案! –

相關問題