數(shù)據(jù)庫越來越大,單個(gè)表中數(shù)據(jù)過多,查詢讀寫,還有鎖機(jī)制,會導(dǎo)致嚴(yán)重的數(shù)據(jù)庫性能影響.
表鎖,行鎖,都是為了保證數(shù)據(jù)的完整性,
分表
分表是把一個(gè)大表,分成若干個(gè)獨(dú)立儲存空間的表,每個(gè)表都對應(yīng)MYD數(shù)據(jù)文件,MYI索引文件,FRM表結(jié)構(gòu)文件,這些表可以分布在一個(gè)存儲設(shè)備,也可以分在不同存儲設(shè)備.
相當(dāng)于一個(gè)表變?yōu)槎鄠€(gè)表,如果這時(shí)候有APP已經(jīng)在使用中,而且會對原表進(jìn)行操作等等,需要開發(fā)修改代碼,因?yàn)樵瓉淼囊粋€(gè)表已經(jīng)分成好幾個(gè),按照原來的表肯定是搜索不到的.
將單表拆分,再根據(jù)一定算法,就可以將數(shù)據(jù)分散到多個(gè)表中,對數(shù)據(jù)量大的數(shù)據(jù)庫,會有明顯的提升,
減少數(shù)據(jù)庫負(fù)擔(dān),縮短查詢時(shí)間,這是分表的主要目的
MySQL分表-分為垂直切分,和水平切分.
垂直切分是按照列切分,水平就是行切分(需求不同自行挑選)
垂直切分
一般垂直切分都是把經(jīng)常查詢的列單獨(dú)分到一張表中,方便查詢
水平拆分
表的數(shù)據(jù)非常龐大,可以分成多個(gè)表,提高查詢效率
--------------------------------------------------------------------------------------------------------
分表的幾種方式
1-mysql集群
這個(gè)不是分表但是也是相同的作用,任務(wù)分擔(dān)到多臺mysql數(shù)據(jù)庫
2-預(yù)先估計(jì)表的訪問量,提前分為若干表,以防萬一
根據(jù)一定算法,將數(shù)據(jù)分散到不同表中.
3-利用merge存儲引擎來分表
merge只能用在myisam上進(jìn)行分表.
merge分為主表跟子表,主表中是子表的位置,如果使用myisam來分表的話APP可以不需要修改連接數(shù)據(jù)的信息,還是可以直接從主表中查詢.
做一個(gè)merge的實(shí)例
create database gao;
use gao;
create table gao(
id bigint auto_increment primary key,
name varchar(20),
sex tinyint not null default '0')
engine=myisam default charset=utf8 auto_increment=1;
批量加入數(shù)據(jù)
insert into gao(name,sex) values('gao',1);
insert into gao(name,sex)select name,sex from gao; 將查詢到的數(shù)據(jù)插入,所以,數(shù)據(jù)都一樣只是測驗(yàn)用
開始進(jìn)行分表,首先創(chuàng)建兩個(gè)子表
use gao;
drop table if exists gao_1;
create table gao_1(
id bingint primary key,
name varchar(20)
sex tinyint not null default '0')
engine=myisam default charset=utf8;
因?yàn)榈诙€(gè)表跟上面的一模一樣除了名字
create table gao_2 like gao_1;
創(chuàng)建主表
drop table if exists mastergao;
create table mastergao(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0')
engine=mergeunion=(gao_1,gao_2) insert_method=last charset=utf8 auto_increment=1;
insert_method = last 表示茶如道最后一張表 first 表示插入到第一張表
數(shù)據(jù)導(dǎo)入到兩個(gè)子表當(dāng)中.
insert into gao_1(id,name,sex) select id,name,sex from gao where id%2=1;
insert into gao_2(id,name,sex) select id,name,sex from gao where id%2=0;
id%2后的值單雙導(dǎo)入到兩個(gè)表中
這時(shí)候查詢兩個(gè)表跟主表,數(shù)據(jù)都有了就可以刪除原來的gao將mastergao更改為gao即可.
alter table mastergao rename gao;完成
--------------------------------------------------------------------------------------------------------------
創(chuàng)新互聯(lián)成立十載來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、域名注冊、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗(yàn)好、性價(jià)比高、打開快等等,這些對于網(wǎng)站建設(shè)都非常重要,創(chuàng)新互聯(lián)通過對建站技術(shù)性的掌握、對創(chuàng)意設(shè)計(jì)的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。