mysql分表
?
MySQL高級(jí)特性-合并表
MERGE存儲(chǔ)引擎把一組MyISAM數(shù)據(jù)表當(dāng)做一個(gè)邏輯單元來對(duì)待,讓我們可以同時(shí)對(duì)他們進(jìn)行查詢。構(gòu)成一個(gè)MERGE數(shù)據(jù)表結(jié)構(gòu)的各成員MyISAM數(shù)據(jù)表必須具有完全一樣的結(jié)構(gòu)。每一個(gè)成員數(shù)據(jù)表的數(shù)據(jù)列必須按照同樣的順序定義同樣的名字和類型,索引也必須按照同樣的順序和同樣的方式定義。
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語(yǔ)句都發(fā)送到合并表的最后一個(gè)表上。定義FIRST或LAST是控制插入數(shù)據(jù)位置的唯一方式(但是也可以直接插入到下屬表中)。 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;# 插入兩條數(shù)據(jù)到test1 insert into test1(name, sex) values('a1',1); insert into test1(name, sex) values('a2',2);# 插入兩條數(shù)據(jù)到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); #對(duì)其它表沒影響 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); #換個(gè)引擎 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;#查不到任何內(nèi)容。只能是MyISAM引擎 select * from test_main3;
?
合并表對(duì)性能的影響
? ? ? ? MySQL對(duì)合并表的實(shí)現(xiàn)對(duì)性能有一些重要的影響。和其他MySQL特性一樣,它在某些條件下性能會(huì)更好。下面是關(guān)于它的一些注意事項(xiàng):
? ? ? ?1) 合并表比含有同樣數(shù)據(jù)的非合并表需要更多的文件描述符。盡管合并表看上去是一個(gè)表,它實(shí)際是逐個(gè)打開了下屬表。這樣的結(jié)果就是單個(gè)表的緩存可以創(chuàng)建許多文件描述符。因此,即使已經(jīng)配置了表的緩存,讓服務(wù)器線程的文件描述符數(shù)量不要超過操作系統(tǒng)的限制,合并表仍然有可能導(dǎo)致超過這一限制。
? ? ? ? 2) 創(chuàng)建合并表的CREATE語(yǔ)句不會(huì)檢查下屬表是否是兼容的。如果下屬表的定義有輕微的不一樣,MySQL會(huì)創(chuàng)建合并表,但是卻無(wú)法使用。同樣,如果在創(chuàng)建了一個(gè)有效的合并表之后對(duì)某個(gè)下屬表進(jìn)行了改變,它也會(huì)無(wú)法工作,并且會(huì)顯示下面的錯(cuò)誤信息:"ERROR 1168(HY000):無(wú)法打開定義不同的下屬表,或者非MyISAM表,或者不存在的表"。
? ? ? ?3)訪問合并表的查詢?cè)L問了每一個(gè)下屬表。這也許會(huì)使單行鍵查找比單個(gè)表慢。在合并表中限制下屬表是一個(gè)好主意,尤其是它是聯(lián)接中的第二個(gè)或以后的表。每次操作訪問的數(shù)據(jù)越少,那么訪問每個(gè)表的開銷相對(duì)于整個(gè)操作而言就越重要。下面是一些如何使用合并表的注意事項(xiàng):
? ? ? ?4)范圍查找受訪問所有下屬表的開銷的影響小于單個(gè)查找。
? ? ? 對(duì)索引表的表掃描和對(duì)單個(gè)表一樣快。
? ? ? ?一旦唯一鍵和主鍵查詢成功,它們就立即停止。在這種情況下,服務(wù)器會(huì)挨個(gè)訪問下屬表,一旦查找到了值,就不會(huì)再查找更多的表。
下屬表讀取的順序和CREAT TABLE語(yǔ)句中定義的一致。如果經(jīng)常需要按照特定的順序取得數(shù)據(jù),可以利用這種特性使合并排序操作更快。
?
合并表的長(zhǎng)處? ? ?
合并表在處理數(shù)據(jù)方面既有積極的一面,也有消極的一面。
? ? ? 1) 經(jīng)典的例子就是日志記錄。日志是只追加的,所以可以每天用一個(gè)表。每天創(chuàng)建新的表并把它加入到合并表中。也可以把以前的表從合并表中移除掉,把它轉(zhuǎn)化為壓縮的MyISAM表,再把它們加回到合并表中。
? ? ? 2) 日志追加這并不是合并表的唯一用途。它們通常都被用于數(shù)據(jù)倉(cāng)庫(kù)程序,因?yàn)樗牧硪粋€(gè)長(zhǎng)處就是管理大量的數(shù)據(jù)。在實(shí)際中不太可能管理一個(gè)TB級(jí)別的表,但是如果是由單個(gè)50GB的表組成的合并表,任務(wù)就會(huì)簡(jiǎn)單很多。
? ? ? ?當(dāng)管理極其巨大的數(shù)據(jù)庫(kù)時(shí),考慮的絕不僅僅是常規(guī)操作。還要考慮崩潰與恢復(fù)。使用小表是很好的主意。檢查和修復(fù)一系列的小表比起一個(gè)大表要快得多,尤其是大表和內(nèi)存不匹配的時(shí)候。還可以并行地檢查和修復(fù)多個(gè)小表。
? ? ? ?數(shù)據(jù)倉(cāng)庫(kù)中另外一個(gè)顧慮就是如何清理掉老的數(shù)據(jù)。對(duì)巨型表使用DELETE語(yǔ)句最佳狀況下效率不高,而在最壞情況下則是一場(chǎng)災(zāi)難。但是更改合并表的定義是很簡(jiǎn)單的,可以使用DROP TABLE命令刪除老的數(shù)據(jù)。這可以輕易地實(shí)現(xiàn)自動(dòng)化。
? ?? 3) 合并表并非只對(duì)日志和大量數(shù)據(jù)有效。它可以方便地按需創(chuàng)建繁忙的表。創(chuàng)建和刪除合并表的代價(jià)是很低的。索引可以像對(duì)視圖使用UNION ALL命令那樣使用合并表。但它的開銷更低,因?yàn)榉?wù)器不會(huì)把結(jié)果放到臨時(shí)表中然后再傳遞給客戶端。這使得它對(duì)于報(bào)告和倉(cāng)庫(kù)化數(shù)據(jù)非常有用。例如,要?jiǎng)?chuàng)建一個(gè)每晚都會(huì)運(yùn)行的任務(wù),它會(huì)把昨天的數(shù)據(jù)和8天前、15天前、以及之前的每一周的數(shù)據(jù)進(jìn)行合并。使用合并表就可以創(chuàng)建無(wú)須修改的查詢,并且自動(dòng)地訪問合適的數(shù)據(jù)。甚至還可以創(chuàng)建臨時(shí)合并表,這是視圖無(wú)法做到的。
因?yàn)楹喜⒈頉]有隱藏下屬的MyISAM表,所以它提供了一些分區(qū)表無(wú)法提供的特性:
一個(gè)MyISAM表可以包含很多合并表。
可以通過拷貝.frm、.MYI、.MYD文件在服務(wù)器之間拷貝下屬表。
可以輕易地把更多的表添加到合并表中。這只需要?jiǎng)?chuàng)建一個(gè)新表并且更改合并定義即可。
可以創(chuàng)建只包含想要的數(shù)據(jù)的臨時(shí)合并表,例如某個(gè)特定時(shí)間段的數(shù)據(jù)。這是分區(qū)表無(wú)法做到的。
如果想對(duì)某個(gè)表進(jìn)行備份、恢復(fù)、更改、修復(fù),或者其他的操作,可以把它從合并表中移除,完成所有的工作之后再把它加回來。
可以使用myisampack壓縮某些或所有的下屬表。
分區(qū)表正好相反,MySQL隱藏了分區(qū)表的分區(qū),并只能通過分區(qū)表訪問所有的分區(qū)
變通方案:
創(chuàng)建一個(gè)視圖,但是要每個(gè)月重建一次,把新表包含進(jìn)來,這樣可以用到innodb表
具體方案:
建立視圖,最新數(shù)據(jù)數(shù)據(jù)寫入固定表,例如t_data,當(dāng)某個(gè)月一號(hào),把歷史數(shù)導(dǎo)入到上個(gè)月名稱的一個(gè)歷史表,例如t_data_201811
視圖是v_data包含歷史表(.......,t_data_201811)和當(dāng)前表t_data
總結(jié)
- 上一篇: 流氓APP再见!26条新规严管移动应用:
- 下一篇: linux cmake编译源码,linu