日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql分表

發(fā)布時(shí)間:2023/12/15 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql分表 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

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é)

以上是生活随笔為你收集整理的mysql分表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。