欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
mysql數據庫分表及實(shí)現

項目開(kāi)發(fā)中,我們的數據庫數據越來(lái)越大,隨之而來(lái)的是單個(gè)表中數據太多。以至于查詢(xún)書(shū)讀變慢,而且由于表的鎖機制導致應用操作也搜到嚴重影響,出現了數據庫性能瓶頸。

當出現這種情況時(shí),我們可以考慮分表,即將單個(gè)數據庫表進(jìn)行拆分,拆分成多個(gè)數據表,然后用戶(hù)訪(fǎng)問(wèn)的時(shí)候,根據一定的算法,讓用戶(hù)訪(fǎng)問(wèn)不同的表,這樣數據分散到多個(gè)數據表中,減少了單個(gè)數據表的訪(fǎng)問(wèn)壓力。提升了數據庫訪(fǎng)問(wèn)性能。

我們可以進(jìn)行簡(jiǎn)單的設想:現在有一個(gè)表products存儲產(chǎn)品信息,現在有100萬(wàn)用戶(hù)在線(xiàn)訪(fǎng)問(wèn),就要進(jìn)行至少100萬(wàn)次請求,現在我們如果將它分成100個(gè)表即products0~~products99,那么利用一定的算法我們就分擔了單個(gè)表的訪(fǎng)問(wèn)壓力,每個(gè)表只有1萬(wàn)個(gè)請求(當然,這是理想情況下?。?/p>

實(shí)現mysql 分表的關(guān)鍵在于:設計良好的算法來(lái)確定"什么時(shí)候情況下訪(fǎng)問(wèn)什么(哪個(gè))表"。

下面我們先來(lái)實(shí)現一個(gè)簡(jiǎn)單的mysql分表演示:這里使用MERGE分表法

1,創(chuàng )建一個(gè)完整表存儲著(zhù)所有的成員信息

     

create table member(id bigint auto_increment primary key,name varchar(20),sex tinyint not null default '0')engine=myisam default charset=utf8 auto_increment=1;

加入點(diǎn)數據:

  insert into member(id,name,sex) values (1,'jacson','0');

  insert into member(name,sex) select name,sex from member;

第二條語(yǔ)句多執行幾次就有了很多數據。

 

2,下面我們進(jìn)行分表:這里我們分兩個(gè)表tb_member1,tb_member2

     

DROP table IF EXISTS tb_member1;create table tb_member1(    id bigint primary key auto_increment ,    name varchar(20),    sex tinyint not null default '0')ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
DROP table IF EXISTS tb_member2;create table tb_member2(    id bigint primary key auto_increment ,    name varchar(20),    sex tinyint not null default '0')ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
//創(chuàng  )建tb_member2也可以用下面的語(yǔ)句  create table tb_member2 like tb_member1;

 

   3,創(chuàng )建主表tb_member

DROP table IF EXISTS tb_member;
create table tb_member(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;

查看一下tb_member表的結構:desc tb_member;

4,接下來(lái),我們把數據分到兩個(gè)分表中去:

insert into tb_member1(id,name,sex) select id,name,sex from member where id%2=0;

insert into tb_member2(id,name,sex) select id,name,sex from member where id%2=1;

查看一下主表的數據:select * from tb_member;

注意:總表只是一個(gè)外殼,存取數據發(fā)生在一個(gè)一個(gè)的分表里面。

ps:創(chuàng )建主表時(shí)可能會(huì )出現下面的錯誤:

ERROR 1168 (HY000): Unable to open underlying table which is differently defined
or of non-MyISAM type or doesn't exist

若遇到上面這種錯誤,一般從兩方面來(lái)排查:(從這兩方面一般可以解決這個(gè)問(wèn)題,本人也遇到了。)

  1,查看上面的分表數據庫引擎是不是MyISAM.

  2,查看分表與指標的字段定義是否一致。

 

分表的大概過(guò)程和步驟就是這樣的,下面我們來(lái)看看分表的算法實(shí)現:

假設現在有一個(gè)應用系統可能會(huì )有100億的用戶(hù)量,另外一個(gè)表一般存儲量在不超過(guò)100萬(wàn)的時(shí)候基本能保持良好性能,計算下來(lái),我們需要1萬(wàn)張表,即分表為1萬(wàn)個(gè)表。

我們可以設計成:user_0~user_9999

在用戶(hù)表里面我們有唯一的標示是用戶(hù)id,我們尅設計一個(gè)小算法來(lái)實(shí)現用戶(hù)id與訪(fǎng)問(wèn)表名的對應:

function getTable($id)

{

   return 'user_'.sprintf('%d',($id >>20));

}

解釋一下:($id >> 20)表示將向右移位20位,(向右移動(dòng)一位標示減少一半),printf('%d',$data)標示將數據按照十進(jìn)制輸出。

               即id為1~1048575(2的20次冪-1)時(shí)均訪(fǎng)問(wèn)user_0,1048576~2097152時(shí)訪(fǎng)問(wèn)user_1,以此類(lèi)推.....

那么問(wèn)題來(lái)了,如果用戶(hù)更多怎么辦,現在需要一個(gè)可擴展的方法:

function getTable($id,$bit,$seed){
   return 'user_'.sprintf('%0{$bit}d',($id >> $seed));
}
其中:$id為用戶(hù)id,$bit標示表后綴的位數,$seed表示要移位的位數即:?jiǎn)蝹€(gè)表能存儲的記錄條數。
這樣就可以任意分表了。
總結:
     其實(shí)上面我們介紹的是水平分表的實(shí)施方法,還存在另一種方法叫做:垂直分表
     垂直分表:
      舉例說(shuō)明,在一個(gè)博客系統中,文章標題,作者,分類(lèi),創(chuàng )建時(shí)間等,是變化頻率慢,查詢(xún)次數多,而且最好有很好的實(shí)時(shí)性的數據,我們把它叫做冷數據。
    而博客的瀏覽量,回復數等,類(lèi)似的統計信息,或者別的變化頻率比較高的數據,我們把它叫做活躍數據。
       我們進(jìn)行縱向分表后:
      1,存儲引擎的使用不同,冷數據使用MyIsam 可以有更好的查詢(xún)數據?;钴S數據,可以使用Innodb ,可以有更好的更新速度。
      2,對冷數據進(jìn)行更多的從庫配置,因為更多的操作是查詢(xún),這樣來(lái)加快查詢(xún)速度。對熱數據,可以相對有更多的主庫的橫向分表處理。
      3,對于一些特殊的活躍數據,也可以考慮使用memcache ,redis之類(lèi)的緩存,等累計到一定量再去更新數據庫.
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
關(guān)于論壇數據庫的設計(分表分庫等) – PHP學(xué)習網(wǎng)
oracle數據庫基礎,初學(xué)必備
Cobar介紹及配置
數據庫:SQLServer中in和 exists函數用法筆記
MySQL Execute Plan--Index Merge特性
分布式ID生成方案
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久