mysql分表
?
MySQL高級特性-合并表
MERGE存儲引擎把一組MyISAM數據表當做一個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成一個MERGE數據表結構的各成員MyISAM數據表必須具有完全一樣的結構。每一個成員數據表的數據列必須按照同樣的順序定義同樣的名字和類型,索引也必須按照同樣的順序和同樣的方式定義。
create database testdb; show databases; use testdb;create table test1( id bigint auto_increment primary key, name varchar(20), sex tinyint not null default '0' ) engine=myisam default charset=utf8 auto_increment=1;create table test2 like test1show tables;# 指令告訴MySQL把所有的INSERT語句都發送到合并表的最后一個表上。定義FIRST或LAST是控制插入數據位置的唯一方式(但是也可以直接插入到下屬表中)。 create table test_main( id bigint primary key, name varchar(20), sex tinyint not null default '0' ) engine=merge union(test1,test2) insert_method=last charset=utf8;create table test_main2( id bigint auto_increment primary key, name varchar(20), sex tinyint not null default '0' ) engine=merge union(test1,test2) insert_method=last charset=utf8 auto_increment=1;# 插入兩條數據到test1 insert into test1(name, sex) values('a1',1); insert into test1(name, sex) values('a2',2);# 插入兩條數據到test2 insert into test2(name, sex) values('b1',1); insert into test2(name, sex) values('b2',1);select * from test1; select * from test2; select * from test_main; select * from test_main2;# 從主表插入,是插入到test2 insert into test_main2(name, sex) values('b4',1); #對其它表沒影響 drop table test_main;#加入新表 create table test3 like test1;#重建主表 create table test_main( id bigint auto_increment primary key, name varchar(20), sex tinyint not null default '0' ) engine=merge union(test1,test2,test3) insert_method=last charset=utf8 auto_increment=1;# 從test_main主表插入,是插入到test3 insert into test_main(name, sex) values('b5',1); #換個引擎 create table test_main3( id bigint auto_increment primary key, name varchar(20), sex tinyint not null default '0' ) engine=innodb union(test1,test2,test3) insert_method=last charset=utf8 auto_increment=1;#查不到任何內容。只能是MyISAM引擎 select * from test_main3;
?
合并表對性能的影響
? ? ? ? MySQL對合并表的實現對性能有一些重要的影響。和其他MySQL特性一樣,它在某些條件下性能會更好。下面是關于它的一些注意事項:
? ? ? ?1) 合并表比含有同樣數據的非合并表需要更多的文件描述符。盡管合并表看上去是一個表,它實際是逐個打開了下屬表。這樣的結果就是單個表的緩存可以創建許多文件描述符。因此,即使已經配置了表的緩存,讓服務器線程的文件描述符數量不要超過操作系統的限制,合并表仍然有可能導致超過這一限制。
? ? ? ? 2) 創建合并表的CREATE語句不會檢查下屬表是否是兼容的。如果下屬表的定義有輕微的不一樣,MySQL會創建合并表,但是卻無法使用。同樣,如果在創建了一個有效的合并表之后對某個下屬表進行了改變,它也會無法工作,并且會顯示下面的錯誤信息:"ERROR 1168(HY000):無法打開定義不同的下屬表,或者非MyISAM表,或者不存在的表"。
? ? ? ?3)訪問合并表的查詢訪問了每一個下屬表。這也許會使單行鍵查找比單個表慢。在合并表中限制下屬表是一個好主意,尤其是它是聯接中的第二個或以后的表。每次操作訪問的數據越少,那么訪問每個表的開銷相對于整個操作而言就越重要。下面是一些如何使用合并表的注意事項:
? ? ? ?4)范圍查找受訪問所有下屬表的開銷的影響小于單個查找。
? ? ? 對索引表的表掃描和對單個表一樣快。
? ? ? ?一旦唯一鍵和主鍵查詢成功,它們就立即停止。在這種情況下,服務器會挨個訪問下屬表,一旦查找到了值,就不會再查找更多的表。
下屬表讀取的順序和CREAT TABLE語句中定義的一致。如果經常需要按照特定的順序取得數據,可以利用這種特性使合并排序操作更快。
?
合并表的長處? ? ?
合并表在處理數據方面既有積極的一面,也有消極的一面。
? ? ? 1) 經典的例子就是日志記錄。日志是只追加的,所以可以每天用一個表。每天創建新的表并把它加入到合并表中。也可以把以前的表從合并表中移除掉,把它轉化為壓縮的MyISAM表,再把它們加回到合并表中。
? ? ? 2) 日志追加這并不是合并表的唯一用途。它們通常都被用于數據倉庫程序,因為它的另一個長處就是管理大量的數據。在實際中不太可能管理一個TB級別的表,但是如果是由單個50GB的表組成的合并表,任務就會簡單很多。
? ? ? ?當管理極其巨大的數據庫時,考慮的絕不僅僅是常規操作。還要考慮崩潰與恢復。使用小表是很好的主意。檢查和修復一系列的小表比起一個大表要快得多,尤其是大表和內存不匹配的時候。還可以并行地檢查和修復多個小表。
? ? ? ?數據倉庫中另外一個顧慮就是如何清理掉老的數據。對巨型表使用DELETE語句最佳狀況下效率不高,而在最壞情況下則是一場災難。但是更改合并表的定義是很簡單的,可以使用DROP TABLE命令刪除老的數據。這可以輕易地實現自動化。
? ?? 3) 合并表并非只對日志和大量數據有效。它可以方便地按需創建繁忙的表。創建和刪除合并表的代價是很低的。索引可以像對視圖使用UNION ALL命令那樣使用合并表。但它的開銷更低,因為服務器不會把結果放到臨時表中然后再傳遞給客戶端。這使得它對于報告和倉庫化數據非常有用。例如,要創建一個每晚都會運行的任務,它會把昨天的數據和8天前、15天前、以及之前的每一周的數據進行合并。使用合并表就可以創建無須修改的查詢,并且自動地訪問合適的數據。甚至還可以創建臨時合并表,這是視圖無法做到的。
因為合并表沒有隱藏下屬的MyISAM表,所以它提供了一些分區表無法提供的特性:
一個MyISAM表可以包含很多合并表。
可以通過拷貝.frm、.MYI、.MYD文件在服務器之間拷貝下屬表。
可以輕易地把更多的表添加到合并表中。這只需要創建一個新表并且更改合并定義即可。
可以創建只包含想要的數據的臨時合并表,例如某個特定時間段的數據。這是分區表無法做到的。
如果想對某個表進行備份、恢復、更改、修復,或者其他的操作,可以把它從合并表中移除,完成所有的工作之后再把它加回來。
可以使用myisampack壓縮某些或所有的下屬表。
分區表正好相反,MySQL隱藏了分區表的分區,并只能通過分區表訪問所有的分區
變通方案:
創建一個視圖,但是要每個月重建一次,把新表包含進來,這樣可以用到innodb表
具體方案:
建立視圖,最新數據數據寫入固定表,例如t_data,當某個月一號,把歷史數導入到上個月名稱的一個歷史表,例如t_data_201811
視圖是v_data包含歷史表(.......,t_data_201811)和當前表t_data
總結
- 上一篇: 流氓APP再见!26条新规严管移动应用:
- 下一篇: 打算退休?传美团创业班底、高级副总裁陈亮