Mysql

每個表的最大 TEXT/BLOB 列數/其中許多表的性能?

  • May 4, 2016

我創建了一個系統,該系統通常將 CSV 導入到帶有元數據列的數據庫表中,以跟踪 CSV 記錄何時更改,並且它允許過濾 CSV 列,而不必每次都讀取整個文件。現在,表的結構基本上是:

id, csv_id, hash, date_modified, column_0, column_1, ..., column_63, column_64

這些列都是 VARCHAR(255) 因為我想要最大數量的最大列數。我的數據庫是 UTF-8,因此每個列的大小都必須乘以 3,並且該值必須​​低於 65,535。這是我目前架構的大小:

255 * 65 * 3 = 49,725

255 (*3) 字節太小,因為 URL 列可能儲存在數據庫中,最多可達 512 字節或更多。我的問題是我是否制定了以下模式:

column_0 (TEXT), column_1 (TEXT), ..., column_63 (TEXT), column_64 (TEXT)

**數據庫表上是否有最大數量的 TEXT 列?**我現在使用的是 MySQL 5.6,但我會將數據庫遷移到 Amazon Aurora。我的直覺說這樣做的性能會很糟糕,我確實需要過濾列的內容。

如果對於較小的列子集的性能影響不是太大,我正在考慮使用混合解決方案:

id, csv_id, hash, date_modified, data LONGTEXT, column_0 VARCHAR(512), ..., column_19 VARCHAR(512)

其中 data 是 JSON 數組,20 列是映射到系統其他地方的索引,但如果將它們全部更改為 TEXT(因為列可以更長,理論上),如何設計:

id, csv_id, hash, date_modified, data LONGTEXT, column_0 TEXT, ..., column_19 TEXT

不同?

如果將所有column_##列集中到一個JSON欄位中,則可以有 4GB 的限制。

多少的問題變得複雜了。InnoDB 有 4 個ROW_FORMATs:冗餘、緊湊、動態、壓縮。我認為您VARCHAR(255)可以TEXTROW_FORMAT=DYNAMIC. 該格式使用記錄中的 20 字節指針指向實際文本的儲存位置。

如果您將塊大小從預設的 16KB 更改為 32KB,您可以獲得大約 800 列。轉到 64KB 將達到 1017 列的限制(在 5.6.9 中)。更改塊大小並非易事,所以我不推薦它。

更多限制。(嗯……也許我應該在那裡添加你的問題。)

這兩個陳述確實在一起:“這將是可怕的”和“我確實需要過濾列的內容”。這是因為DYNAMIC對於您需要“過濾”的每一列都有一個額外的磁碟提取。另一方面,在某些情況下(短文本、沒有太多列等),某些列的整個文本可能會內聯儲存。

COMPACT實際上可能會更好。這種格式試圖將文本保留在記錄中。但是,如果記錄變得大於大約 8K,它就會剝離較長的單元以進行塊外儲存。它將內聯記錄的前 768 個字節。從那時起,您將被限制為大約 10 列。(嘗試 12 列,它會向你吐口水。)

相信你會需要innodb_file_per_table=1DYNAMIC

你將如何“過濾”?

引用自:https://dba.stackexchange.com/questions/137285