分開表或分割一張大表?
我正在建構一個包含特定列的相當大的表,
my_column
. 有少量可能的值my_column
,並且每個唯一值都my_column
應該有相同數量的與之關聯的行。此外,查詢很可能一次只關註一個特定的值my_column
。我看到一種選擇是根據my_column
. 我看到的另一種選擇是完全創建一個單獨的表,以便每個表都與my_column
. 我想知道是什麼導致我選擇一個選項而不是另一個選項。據我了解,一個分區的大表似乎是“正確”或“純粹”的方式,因為這似乎是分區的主要案例。但是,我懷疑出於實際原因,第二種選擇更好,這就是我所傾向於的。我不知道這是否重要,但我正在處理 MyISAM 表。
我對你的第二個選項有一個建議。
如果您需要將具有每個唯一
my_column
值的 MyISAM 表與其他 MyISAM 表分開,您可能需要查看MERGE (Mrg_MyISAM) 儲存引擎作為表分區的替代方法。這將允許將同一數據庫中具有相同表結構和索引佈局的多個 MyISAM 表映射在一起,從而使單個查詢命中所有 MyISAM 表。
假設您有一個如下表:
CREATE TABLE tb1 ( my_column INT NOT NULL id INT NOT NULL AUTO_INCREMENT, name VARCHAR(30), PRIMARY KEY (my_column,id), KEY name (my_column,name) ) ENGINE=MyISAM;
你有 3 個這樣的表(tb1、tb2、tb3),其中
- tb1 的 my_column = 1
- tb2 的 my_column = 2
- tb3 的 my_column = 3
您可以將它們合併到單個表映射下,如下所示:
CREATE TABLE tbmerge LIKE tb1; ALTER TABLE tbmerge ENGINE=Mrg_MyISAM UNION=(tb1,tb2,tb3);
要對所有表執行搜尋,只需使用 tbmerge。例如,假設您想查看 tb2 中以“Jack”開頭的每個名稱,您可以執行以下查詢:
SELECT name FROM tbmerge WHERE my_column=2 AND name LIKE 'Jack%';
鑑於表的設計,您應該始終指定 my_column 的值。事實上,對於 tb1 的每個索引,確保 my_column 始終是第一列。原因?針對 tbmerge 的查詢始終是針對 tb1、tb2、tb3(所有基礎表)的查詢。否則,此查詢
SELECT name FROM tbmerge WHERE name LIKE 'Jack%';
將遇到可怕的性能,因為它將對所有基礎表執行表掃描。請按照這個簡單的規則仔細計劃您將使用的索引(使用 my_column 作為每個索引的第一列)
還有一個額外的好處:您可以在方便時插入基礎表,從而使用