Mysql

分開表或分割一張大表?

  • October 15, 2015

我正在建構一個包含特定列的相當大的表,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 作為每個索引的第一列)

還有一個額外的好處:您可以在方便時插入基礎表,從而使用

我在之前的一篇文章(2012 年 1 月 4 日)中使用 MERGE 表討論了這個問題

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