Mysql通過Merge引擎進行分表

2022-08-12 03:09:20 字數 3473 閱讀 5867

**:

分表的id不能是自增(auto increment)的;

分表必須使用myisam儲存引擎;

每個分表的表結構必須相同;

mysql必須具有儲存分表資料檔案和索引檔案的目錄的讀寫許可權;

必須啟用mysql的符號鏈結支援功能。

總表的表結構必須與各個分表相同;

總表必須使用mrg_myisam儲存引擎;

總表不會建立任何資料檔案和索引檔案;

mrg檔案儲存總表需要對映的子表的表名;

總表本身不儲存任何資料和索引;

insert_method需要設定為no,或者不配置;

總表的id不能是自增(auto increment)的。

適用於儲存日誌資料。例如,可以將不同月份的資料存入不同的表,然後使用myisampack工具壓縮資料,最後通過一張merge表來查詢這些資料。

可以獲得更快的速度。可以根據某種指標,將一張唯讀的大表分割成若干張小表,然後將這些小表分別放在不同的磁碟上儲存。當需要讀取資料時,merge表可以將這些小表的資料組織起來,就好像使用先前的大表一樣,但是速度會快很多。

可以提高搜尋效率。可以根據某種指標將一張唯讀的大資料表分割為若干個小表,然後根據不同的查詢維度,可以得到若干種小表的組合,然後再為這些組合分別建立不同的merge表。例如,有一張唯讀的大資料表t,分割為t1、t2、t3、t4,共4張小表,有兩種查詢維度a和b,a可以得到小表組合t1、t2和t3,b可以得到小表組合t2、t3和t4,分別為a和b建立兩個merge表,也就是m1和m2,這兩個merge表分別關聯的小表是存在交疊的。

可以更加有效的修復表。修復單個的小表要比修復大資料表更加容易。

多個子表對映至乙個總表的速度極快。因為merge表本身不會儲存和維護任何索引,索引都是由各個關聯的子表儲存和維護的,所以建立和重新對映merge表的速度非常快。

不受作業系統的檔案大小限制。單個表會受到檔案大小的限制,但是拆分成多個表,則可以無限擴容。

merge表還可以用來給單個表建立別名,並且幾乎不會影響效能。

總表(merge表)必須使用mrg_myisam儲存引擎,子表必須使用myisam儲存引擎,不可避免會受到myisam儲存引擎的限制。

merge表不能使用某些myisam特性。例如,雖然可以為子表建立全文索引,但是卻不能使用全文索引,通過merge表查詢資料。

merge表會使用更多的檔案描述符。如果有10個客戶端使用1張merge表,那麼就需要消耗(10×10)+10個檔案描述符(其中,10個客戶端分別有10個資料檔案描述符,並且會共享使用10個索引檔案描述符)。

若使用alter table語句修改總表的儲存引擎,那麼會立即丟失總表和子表的對映關係,並且會將所有子表的資料拷貝至修改後的新錶。

總表和子表的主鍵都不能使用自動增長(auto increment)。

子表之間不能保證唯一鍵約束,只能保證單個子表內部的唯一性約束。

由於不能保證唯一鍵約束,導致replace語句的行為會不可預期,insert ... on duplicate key update語句也有類似問題。因此,只能使用路由策略,對子表使用這些語句,而不能對總表使用。

子表不支援分割槽(partition)。

當正在使用總表時,不能對任何子表執行analyze table、repair table、optimize table、alter table、drop table、delete或truncate table語句,否則會導致不可預期的結果。

總表和子表的表結構必須完全一致。

總表可以對映的所有子表的總行數上限為 264 行。

不支援insert delayed語句。

create database `test` default character set utf8 ;

#建立儲存user1表資料和索引的目錄

mkdir -p /home/user1

chown -r mysql:mysql /home/user1

#建立儲存user2表資料和索引的目錄

mkdir -p /home/user2

chown -r mysql:mysql /home/user2

#建立儲存user3表資料和索引的目錄

mkdir -p /home/user3

chown -r mysql:mysql /home/user3

vi /usr/local/mysql/etc/my.cnf
symbolic-links
service mysqld restart
create table `user1` (

`id` int not null,

`user_name` varchar(45) not null,

`password` varchar(45) not null,

`create_time` timestamp null,

`update_time` timestamp null,

primary key (`id`),

key `user_name` (`user_name`),

key `create_time` (`create_time`)

)engine = myisam;

create table `user2` like user1;

create table `user3` like user1;

create table `users` (

`id` int not null,

`user_name` varchar(45) not null,

`password` varchar(45) not null,

`create_time` timestamp null,

`update_time` timestamp null,

primary key (`id`),

key `user_name` (`user_name`),

key `create_time` (`create_time`)

)engine = merge union = (`user1`,`user2`,`user3`);

create table users like user1;

alter table users engine=merge union(`user1`,`user2`,`user3`) insert_method=no;

可通過檢視users表檔案檢視是否關聯成功,如:

cat /var/lib/mysql/test/users.mrg

MySQL 儲存引擎 MERGE 的介紹

最近在搞乙個 專案,每個站點每月的資料量近150 200萬條記錄,因為採用站點和日期分表機制來減輕伺服器的壓力,但專案中又必須對全部站點以及跨日期進行查詢資料功能。merge儲存引擎型別允許把許多結構相同的表合併為乙個大表。然後,你可以執行查詢,從多個表返回的結果就像從乙個表返回的結果一樣,從而不需...

Mysql的MERGE儲存引擎詳解

merge 儲存引擎把一組 myisam 資料表當做乙個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成乙個 merge 資料表結構的各成員 myisam 資料表必須具有完全一樣的表結構。每乙個成員資料表的資料列必須按照同樣的順序定義同樣的名字和型別,索引也必須按照同樣的順序和同樣的方式定義。假設...

merge儲存引擎

merge儲存引擎是一組myisam 表的集合。這些myisam 表的結構必須完全相同。對merge表進行的操作實際是對myisam 表的操作。但是,刪除merge 表並不會影響內部的myisam 表。它的檔案有 frm mrg insert method 的值 有 3 個 no 表示不能對merg...