2011-08-11 43 views
6

我們有一個表,當前有一個TEXT列,列的平均長度大約爲2,000個字符。我們想知道如果平均值是5k,10k,20k等,選擇該列的查詢的性能會如何。當TEXT列中的數據線性增長時,MySQL查詢時間呈指數增長

我們設置了一個獨立測試,發現隨着TEXT列的長度線性增加,查詢時間呈指數增長。

任何人有任何關於爲什麼這可能是快速的想法。可以提供更多信息,但非常簡單。

+0

您是否使用了全文索引與'match against'結合使用。這是搜索文本列的推薦方式。 – Johan

+0

我們不是在TEXT列中搜索,只是選擇它。SELECT * FROM t WHERE t.id <50;等 –

+0

選擇*是非常糟糕的形式,只選擇你真正需要的領域。因爲你(可能)通過線路發送大量不需要的數據。另外,如果您使用的是InnoDB,那麼您就會喪失使用覆蓋索引的機會,請注意@Mchl的答案。 – Johan

回答

1

其中一個原因,可能是因爲TEXTBLOB字段不一起存儲與所有其他「常規」領域,使數據庫引擎實際上需要從磁盤的另一個領域扯這些。

我們需要查看您的查詢它是通過ID字段查找的,還是您在TEXT字段中搜索?在後一種情況下,隨着存儲文本的平均長度增加,數據庫處理的數據量也增加,並且數據量呈指數增長。

+0

是的,但爲什麼指數? –

+0

...不,它不是指數...我錯了。在我的腦海裏想象了一些其他東西,但是當開始計算它時,它仍然是線性的; P – Mchl

+0

我們的隔離測試是一個包含2列的表:一個id和一個TEXT列。我們的查詢是以50爲增量從表中選擇id。所以說它有1000行我們會做0

0

您只能選擇您要使用limit查看這些字段:

SELECT field1, f2, f3 FROM table1 ORDER BY id LIMIT 0,30 

在接下來的30行做

SELECT field1, f2, f3 FROM table1 ORDER BY id LIMIT 30,30 

您不能讀取10K排在一個去反正,這會讓你的選擇速度更快。

0

這是關係到有多少數據可以在磁盤讀取週期中的MySQL讀取,
多少數據可以通過在數據網絡發送週期發送

當數據量的增長,更多的開銷會在

  • 磁盤讀取週期(MySQL的花費記錄尋求更多的時間)
  • 發送數據的(需要更多的週期,以允許通過網絡的數據傳輸)

並不是所有的數據都存儲在內存中特別是在文字和BLOB,
MySQL的需要發現從磁盤上的數據,
並回傳給客戶

換句話說

,MySQL索引的速度快,
因爲它不需要磁盤讀取

+0

我主要同意你的分析,但我想要一種方法來證明它... –

+0

比較磁盤讀寫速率 – ajreal

0

這是一個非常瘋狂的猜測,但這可能是一個低級別的實現問題,MySql不希望你一次檢索這麼多的數據,因此它必須重新分配一個更大的塊內存用於內部使用,並將數據從舊位置複製到新位置,然後重複執行此操作隨着數據量的增長,數據量再次翻倍,這是我腦海中唯一可以解釋查詢時間呈指數增長而數據線性增長的唯一事情。您的解決方案是限制您一次檢索的數據量。