mysql怎么分權(quán)重 mysql 權(quán)重排序

mysql全文搜索,多個(gè)關(guān)鍵詞權(quán)重排序

自己在寫一個(gè)web,希望對(duì)數(shù)據(jù)庫(kù)做全文檢索。但是google了解到,由于中文分詞的緣故,mysql只支持英文的全文搜索,想支持中文的,需要各種插件or實(shí)現(xiàn)一些比較復(fù)雜的機(jī)制,而買的虛擬主機(jī)并不支持這些復(fù)雜的東西。仔細(xì)想了下,因?yàn)樽约盒枨蟮墓δ芤脖容^簡(jiǎn)單,主要是2個(gè)字段的搜索,且數(shù)據(jù)量不大,即便增加幾個(gè)字段,需要多運(yùn)行幾個(gè)select也不會(huì)對(duì)速度有太大影響,所以通過(guò)一些work?around實(shí)現(xiàn)了需求。Step?1:用locate進(jìn)行簡(jiǎn)單的搜索Locate可以判斷子串是否在子亂?有兩個(gè)column,一個(gè)name,一個(gè)description.所以可以用LOCATE0去判斷是否關(guān)鍵字在其中出現(xiàn)了。?其實(shí)就是?SELECT?*?FROM?table?WHERE?LOCATE(key,?'name')0?OR?LOCATE(key,?'description);這樣,我們就簡(jiǎn)單實(shí)現(xiàn)了對(duì)某個(gè)key在兩個(gè)域的搜索Step?2:搜索多個(gè)關(guān)鍵字?通常,搜索都是有多個(gè)關(guān)鍵字,所以我們需要對(duì)每個(gè)關(guān)鍵字,執(zhí)行下Step1的查詢。(當(dāng)然,也可以合成一個(gè),這里偷懶每次只查詢1個(gè)關(guān)鍵字)?然后,我們?cè)賹⒚看尾樵兂龅臄?shù)組都合并,這樣就得到了一個(gè)最終的集合。php代碼如下:

創(chuàng)新互聯(lián)公司憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營(yíng)銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了做網(wǎng)站、網(wǎng)站設(shè)計(jì)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。

function?selectlocate($tarcols,$skey){?

$where?="";

$connector?=?"?";

global?$count;

foreach($tarcols?as?$tarcol?){

$where?.=?$connector;

$where?.=?"LOCATE('$skey',?$tarcol)?!=?0??";

if($connector?==?"?"){

$connector?=?"?OR?";

}

}

$sql?=?"SELECT?*?FROM?pets_table?WHERE?$where";

$result?=?mysql_query($sql);

$ret?=?Array();

while($item?=?mysql_fetch_array($result,?MYSQL_ASSOC)){

$count?++;

$ret[]?=?$item;

}

return?$ret;

}

Step?3:匹配的權(quán)重?上面Step2的結(jié)果,其實(shí)是無(wú)序的。通常,如果我們搜索一個(gè)字段:1.如果這個(gè)字段和關(guān)鍵字完全相同,那么一般來(lái)講,可能這個(gè)結(jié)果應(yīng)該是相關(guān)度最高的2.如果他只是其其中出現(xiàn)了一次,相關(guān)度就最低。3.如果他出現(xiàn)的次數(shù)比在其他row中出現(xiàn)的次數(shù)高,那么他的相關(guān)度就比2中的結(jié)果高?所以,搜索的時(shí)候依據(jù)這個(gè)順序考慮權(quán)重,a.如果完全相等,權(quán)重為1000?b.如果出現(xiàn)1次,權(quán)重為10,出現(xiàn)n次c.權(quán)重為n*10每次搜索出來(lái)的結(jié)果附加上權(quán)重----》然后合并相同項(xiàng)----》并把權(quán)重累加?最后按權(quán)重排序,即可得到一個(gè)有排序的搜索結(jié)果。?以下是兩種1關(guān)鍵字對(duì)應(yīng)1個(gè)字段(上面的代碼是1關(guān)鍵字多個(gè)字段)查詢的代碼(不包含合并兩個(gè)數(shù)組的代碼,相關(guān)的代碼在Step4中),只需遍歷每個(gè)關(guān)鍵字和字段,就能完成搜索

$count?=?0;?

function?selectequal($col,$skey){

$connector?=?"?";

global?$count;

$sql?=?"SELECT?*?FROM?pets_table?WHERE?LOWER($col)=LOWER('$skey')";

$result?=?mysql_query($sql);

$ret?=?Array();

while($item?=?mysql_fetch_array($result,?MYSQL_ASSOC)){

$count?++;

$item["weight"]?=?1000;

$ret[]?=?$item;

}

return?$ret;

}

function?selectlocate($col,$skey){

global?$count;

$sql?=?"SELECT?*,(LENGTH(description)?-?LENGTH(REPLACE(description,?'$skey',?'')))/LENGTH('$skey')?*10?as?weight?FROM?pets_table?WHERE?LOCATE(LOWER('$skey'),LOWER($col))0";

$result?=?mysql_query($sql);

$ret?=?Array();

while($item?=?mysql_fetch_array($result,?MYSQL_ASSOC)){

$count?++;

$ret[]?=?$item;

}

return?$ret;

}

Step?4:?字段的權(quán)重?在我的需求中,顯然name這個(gè)字段比description更重要,所以在匹配時(shí),對(duì)name字段的結(jié)果應(yīng)該有所傾斜,所以,又可以增加一個(gè)對(duì)字段的權(quán)重系數(shù)。1.如果是在name域的匹配,設(shè)系數(shù)為10;2.如果是在description匹配,設(shè)系數(shù)為1;?將Step?3每次計(jì)算得出的權(quán)重,再乘上這個(gè)系數(shù),就可以得到一個(gè)新的,更有效的權(quán)重值。?最后按權(quán)重排序,即可得到一個(gè)最有相關(guān)度排序的搜索結(jié)果?其他的細(xì)節(jié):?如果一個(gè)關(guān)鍵字已經(jīng)滿足了equal條件,那么再使用locate條件的時(shí)候會(huì)依然返回一個(gè)結(jié)果,所以在使用locate條件的時(shí)候,過(guò)濾掉equal的情況

點(diǎn)擊(此處)折疊或打開(kāi)

?php?

$count?=?0;

function?selectequal($col,$val,$skey){

$connector?=?"?";

global?$count;

$sql?=?"SELECT?*?FROM?pets_table?WHERE?LOWER($col)=LOWER('$skey')";

$result?=?mysql_query($sql);

$ret?=?Array();

while($item?=?mysql_fetch_array($result,?MYSQL_ASSOC)){

$count?++;

$item["weight"]?=?1000*$val;

$ret[]?=?$item;

}

return?$ret;

}

function?selectlocate($col,$val,$skey){

global?$count;

$sql?=?"SELECT?*,(LENGTH(description)?-?LENGTH(REPLACE(description,?'$skey',?'')))/LENGTH('$skey')?*10*$val?as?weight?FROM?pets_table?WHERE?LOCATE(LOWER('$skey'),LOWER($col))0?AND?LOWER($col)!=LOWER('$skey')";

$result?=?mysql_query($sql);

$ret?=?Array();

while($item?=?mysql_fetch_array($result,?MYSQL_ASSOC)){

$count?++;

$ret[]?=?$item;

}

return?$ret;

}

function?cleanarr($arr){

global?$count;

$tmp?=?Array();

$tmpall?=?Array();

foreach($arr?as?$item){

if(array_key_exists($item['uid'],?$tmp)){

$tmp[$item['uid']]+=$item["weight"];

}

else{

$tmp[$item['uid']]?=?$item["weight"];

$tmpall[$item['uid']]?=?$item;

}

}

//sort?by?weight?in?descending?order?

arsort($tmp);

$ret?=?Array();

//rebuild?the?return?arary?

$count?=?0;

foreach($tmp?as?$k=$v){

$count++;

$tmpall[$k]['weight']=$v;

$ret[]=$tmpall[$k];

}

return?$ret;

}

require_once("consvr.php");

$colshash?=?array("name"=10,"description"=1);

$ret?=?Array();

$keywords=explode("?",?$keywords);

$cols?=?array_keys($colshash);

foreach($keywords?as?$keyword){

foreach($colshash?as?$col=$val){

$ret?=?array_merge($ret,selectequal($col,$val,?$keyword));

$ret?=?array_merge($ret,selectlocate($col,$val,?$keyword));

}

}

$ret?=?cleanarr($ret);

$ret?=?array('msg'?=?"Success",?'count'=$count,'children'?=?$ret,?'query'="COMPLEX:NOT?READABLE");

echo?json_encode($ret);

mysql_close();

?

mysql分表不均怎么解決

數(shù)據(jù)分庫(kù)表擴(kuò)容-數(shù)據(jù)不均勻問(wèn)題 原創(chuàng)

2021-12-22 22:18:13

?

這是王姑娘的微博 ?

碼齡10年

關(guān)注

假如前期分三個(gè)庫(kù),一個(gè)庫(kù)兩個(gè)表,項(xiàng)目火爆,數(shù)據(jù)量激增,進(jìn)行擴(kuò)容

增加了新的數(shù)據(jù)庫(kù)表位,會(huì)導(dǎo)致舊的庫(kù)表比新的庫(kù)表數(shù)據(jù)量多,且容易出現(xiàn)超載情況

?

解決方式思想:

不同的庫(kù)表位分配的概率不一樣,性能好的機(jī)器和數(shù)據(jù)量少的機(jī)器提高分配幾率,類似的中間件應(yīng)用場(chǎng)景有nginx

類似這種:

Nginx常見(jiàn)的負(fù)載均衡策略

節(jié)點(diǎn)輪詢(默認(rèn))

weight 權(quán)重配置

簡(jiǎn)介:weight和訪問(wèn)比率成正比,數(shù)字越大,分配得到的流量越高

場(chǎng)景:服務(wù)器性能差異大的情況使用

upstream lbs {

server 192.168.159.133:8080 weight=5;

server 192.168.159.133:8081 weight=10;

}

在分庫(kù)表中的加權(quán)解決方式,目前想到的幾種方案:

庫(kù)表位可以使用對(duì)象形式,配置權(quán)重,避免數(shù)據(jù)傾斜、數(shù)據(jù)集中(思考中...)

編寫算法,根據(jù)不同的,配置權(quán)重,不同的庫(kù)表位配置不同的權(quán)重(思考中...)

加權(quán)配置,list重復(fù)添加出現(xiàn)的高頻的庫(kù)表位(更改速度最快)

例如:dbPrefixList.add("0"); dbPrefixList.add("1"); dbPrefixList.add("a");

這三個(gè)庫(kù)是第一批增加的,已經(jīng)到了900多萬(wàn)單表量?,F(xiàn)在準(zhǔn)備進(jìn)行擴(kuò)容,那么實(shí)現(xiàn)方式如下:

擴(kuò)容庫(kù)位b,c,d

?

/**

* 獲取隨機(jī)的前綴

* @return

*/

public static String getRandomDBPrefix(){

int index = random.nextInt(dbPrefixList.size());

return dbPrefixList.get(index);

}

這樣在獲取隨機(jī)庫(kù)位的時(shí)候,0,1,a獲取到的概率會(huì)低點(diǎn),相對(duì)進(jìn)入的數(shù)據(jù)就會(huì)少些。更多數(shù)據(jù)會(huì)進(jìn)入到b ,c,d中進(jìn)行平衡。

mysql之表分區(qū)

分區(qū)介紹:

一、什么是分區(qū)?

所謂分區(qū),就是將一個(gè)表分成多個(gè)區(qū)塊進(jìn)行操作和保存,從而降低每次操作的數(shù)據(jù),提高性能。而對(duì)于應(yīng)用來(lái)說(shuō)則是透明的,從邏輯上看只有一張表,但在物理上這個(gè)表可能是由多個(gè)物理分區(qū)組成的,每個(gè)分區(qū)都是獨(dú)立的對(duì)象,可以進(jìn)行獨(dú)立處理。

二、分區(qū)作用

1.可以邏輯數(shù)據(jù)分割,分割數(shù)據(jù)能夠有多個(gè)不同的物理文件路徑。

2.可以存儲(chǔ)更多的數(shù)據(jù),突破系統(tǒng)單個(gè)文件最大限制。

3.提升性能,提高每個(gè)分區(qū)的讀寫速度,提高分區(qū)范圍查詢的速度。

4.可以通過(guò)刪除相關(guān)分區(qū)來(lái)快速刪除數(shù)據(jù)

5.通過(guò)跨多個(gè)磁盤來(lái)分散數(shù)據(jù)查詢,從而提高磁盤I/O的性能。

6.涉及到例如SUM()、COUNT()這樣聚合函數(shù)的查詢,可以很容易的進(jìn)行并行處理。

7.可以備份和恢復(fù)獨(dú)立的分區(qū),這對(duì)大數(shù)據(jù)量很有好處。

三、分區(qū)能支持的引擎

MySQL支持大部分引擎創(chuàng)建分區(qū),入MyISAM、InnoDB等;不支持MERGE和CSV等來(lái)創(chuàng)建分區(qū)。同一個(gè)分區(qū)表中的所有分區(qū)必須是同一個(gè)存儲(chǔ)引擎。值得注意的是,在MySQL8版本中,MyISAM表引擎不支持分區(qū)。

四、確認(rèn)MySQL支持分區(qū)

從MySQL5.1開(kāi)始引入分區(qū)功能,可以如下方式查看是否支持:

老版本用:SHOW VARIABLES LIKE '%partition%';

新版本用:show plugins;

五、分區(qū)類型

1. RANGE分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。

例如,可以將一個(gè)表通過(guò)年份劃分成兩個(gè)分區(qū),2001 -2010年、2011-2020。

2. LIST分區(qū):類似于RANGE分區(qū),LIST是列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。

比如 根據(jù)字段 把值為1、3、5的放到一起,2、4、6的另外放到一起 等等...

3. HASH分區(qū):基于用戶定義的表達(dá)式的返回值來(lái)進(jìn)行選擇分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值來(lái)進(jìn)行計(jì)算,這個(gè)函數(shù)必須產(chǎn)生非負(fù)整數(shù)值。

通過(guò)HASH運(yùn)算來(lái)進(jìn)行分區(qū),分布的比較均勻

4. KEY分區(qū):類似于按HASH分區(qū),由MySQL服務(wù)器提供其自身的哈希函數(shù)。

按照KEY進(jìn)行分區(qū)類似于按照HASH分區(qū)

六、使用分區(qū)注意事項(xiàng)

1. 如果表中存在primary key 或者 unique key 時(shí),分區(qū)的列必須是paimary key或者unique key的一個(gè)組成部分,也就是說(shuō),分區(qū)函數(shù)的列只能從pk或者uk這些key中取子集

2. 如果表中不存在任何的paimary key或者unique key,則可以指定任何一個(gè)列作為分區(qū)列

3. 5.5版本前的RANGE、LIST、HASH分區(qū)要求分區(qū)鍵必須是int;MySQL5.5及以上,支持非整形的RANGE和LIST分區(qū),即:range columns 和 list columns (可以用字符串來(lái)進(jìn)行分區(qū))。

七、分區(qū)命名

1. 分區(qū)的名字基本上遵循其他MySQL 標(biāo)識(shí)符應(yīng)當(dāng)遵循的原則,例如用于表和數(shù)據(jù)庫(kù)名字的標(biāo)識(shí)符。應(yīng)當(dāng)注意的是,分區(qū)的名字是不區(qū)分大小寫的。

2. 無(wú)論使用何種類型的分區(qū),分區(qū)總是在創(chuàng)建時(shí)就自動(dòng)的順序編號(hào),且從0開(kāi)始記錄。

八、 創(chuàng)建分區(qū)

1. RANGE分區(qū):

解讀:以上為 uuid小于5時(shí)放到p0分區(qū)下,uuid大于5且小于10放到p1分區(qū)下,uuid大于10且小于15放到p2分區(qū)下,uuid大于15 一直到最大值的存在p3分區(qū)下

2. LIST分區(qū):

解讀:以上為uuid 等于1/2/3/5時(shí)放到p0分區(qū),7/9/10放到p1分區(qū),11/15放到p2分區(qū)。當(dāng)時(shí)用insert into時(shí) 如果uuid的值不存在p0/p1/p2分區(qū)時(shí),則會(huì)插入失敗而報(bào)錯(cuò)。

3. HASH分區(qū):

HASH分區(qū)主要用來(lái)確保數(shù)據(jù)在預(yù)先確定數(shù)目的分區(qū)中平均分布。在RANGE分區(qū)和LIST分區(qū)中必須明確指定一個(gè)指定的列值或列值集合以指定應(yīng)該保存在哪個(gè)分區(qū)中。而在HASH分區(qū)中,MySQL會(huì)自動(dòng)完成這些工作,要做的只是基于將要被哈希的列值指定一個(gè)表達(dá)式,以及指定被分區(qū)的表將要被分割成的分區(qū)數(shù)量,如:

解讀:MySQL自動(dòng)創(chuàng)建3個(gè)分區(qū),在執(zhí)行insert into時(shí),根據(jù)插入的uuid通過(guò)算法來(lái)自動(dòng)分配區(qū)間。

注意:

(1) 由于每次插入、更新、刪除一行,這個(gè)表達(dá)式都要計(jì)算一次,這意味著非常復(fù)雜的表達(dá)式可能會(huì)引起性能問(wèn)題,尤其是在執(zhí)行同時(shí)影響大量行的運(yùn)算(例如批量插入)的時(shí)候。

(2) 最有效率的哈希函數(shù)是只對(duì)單個(gè)表列進(jìn)行計(jì)算,并且它的值隨列值進(jìn)行一致的增大或減小,因?yàn)檫@考慮了在分區(qū)范圍上的“修剪”。也就是說(shuō),表達(dá)式值和它所基于的列的值變化越接近,就越能有效地使用該表達(dá)式來(lái)進(jìn)行HASH分區(qū)。

3.1:線性HASH分區(qū)

線性HASH分區(qū)在“PARTITION BY”子句中添加“LINEAR”關(guān)鍵字。

線性HASH分區(qū)的有點(diǎn)在于增加、刪除、合并和拆分分區(qū)將變得更加快捷,有利于處理含有及其大量數(shù)據(jù)的表。它的缺點(diǎn)在于各個(gè)分區(qū)間數(shù)據(jù)的分布不大可能均衡。

4. KEY分區(qū)

類似于HASH分區(qū),HASH分區(qū)允許用戶自定義的表達(dá)式,而KEY分區(qū)則不允許使用用戶自定義的表達(dá)式;HASH分區(qū)只支持整數(shù)分區(qū),KEY分區(qū)支持除了blob和text類型之外的其他數(shù)據(jù)類型分區(qū)。

與HASH分區(qū)不同,創(chuàng)建KEY分區(qū)表的時(shí)候,可以不指定分區(qū)鍵,默認(rèn)會(huì)選擇使用主鍵或唯一鍵作為分區(qū)鍵,沒(méi)有主鍵或唯一鍵,就必須指定分區(qū)鍵。

解讀:根據(jù)分區(qū)鍵來(lái)進(jìn)行分區(qū)

5. 子分區(qū)

子分區(qū)是分區(qū)表中,每個(gè)分區(qū)的再次分割,適合保存非常大量的數(shù)據(jù)。

解讀:主分區(qū)使用RANGE按照年來(lái)進(jìn)行分區(qū),有3個(gè)RANGE分區(qū)。這3個(gè)分區(qū)中又被進(jìn)一步分成了2個(gè)子分區(qū),實(shí)際上,整個(gè)表被分成了3 * 2 = 6個(gè)分區(qū)。每個(gè)子分區(qū)按照天進(jìn)行HASH分區(qū)。小于2017的放在一起,2017-2020的放在一起,大于2020的放在一起。

注意:

(1) 在MySQL5.1中,對(duì)于已經(jīng)通過(guò)RANGE或LIST分區(qū)了的表在進(jìn)行子分區(qū)是可能的。子分區(qū)既可以使用HASH分區(qū),也可以使用KEY分區(qū)。這也被稱為復(fù)合分區(qū)。

(2) 每個(gè)分區(qū)必須有相同數(shù)量的子分區(qū)。

(3) 如果在一個(gè)分區(qū)表上的任何分區(qū)上使用SUBPARTITION來(lái)明確定義任何子分區(qū),那么就必須定義所有的子分區(qū)。

(4) 每個(gè)SUBPARTITION子句必須包含(至少)子分區(qū)的一個(gè)名字。

(5) 在每個(gè)子分區(qū)內(nèi),子分區(qū)的名字必須是惟一的,目前在整個(gè)表中,也要保持唯一。例如:

子分區(qū)可以用于特別大的表,可以在多個(gè)磁盤間分配數(shù)據(jù)和索引。例如:

九、MySQL分區(qū)處理NULL值的方式

十、分區(qū)管理概述

可以對(duì)分區(qū)進(jìn)行添加、刪除、重新定義、合并或拆分等管理操作。

① RANGE和LIST分區(qū)的管理

1. 刪除分區(qū)語(yǔ)句如:alter table tbl_test drop partition p0;

注意:

(1) 當(dāng)刪除了一個(gè)分區(qū),也同時(shí)刪除了該分區(qū)中所有的數(shù)據(jù)。

(2) 可以通過(guò)show create table tbl_test;來(lái)查看新的創(chuàng)建表的語(yǔ)句。

(3) 如果是LIST分區(qū)的話,刪除的數(shù)據(jù)不能新增進(jìn)來(lái),因?yàn)檫@些行的列值包含在已經(jīng)刪除了的分區(qū)的值列表中。

2. 添加分區(qū)語(yǔ)句如:alter table tbl_test add partition(partition p3 values less than(50));

注意:

(1) 對(duì)于RANGE分區(qū)的表,只可以添加新的分區(qū)到分區(qū)列表的最高端。

(2) 對(duì)于LIST分區(qū)的表,不能添加已經(jīng)包含在現(xiàn)有分區(qū)值列表中的任意值。

3. 如果希望能不丟失數(shù)據(jù)的條件下重新定義分區(qū),可以使用如下語(yǔ)句:

REORGANIZE會(huì)對(duì)分區(qū)的數(shù)據(jù)進(jìn)行重構(gòu)。

ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO(partition_definitions)

(1) 拆分分區(qū)如:

ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO(partition s0 values less than(5),partition s1 values less than(10));

或者如:

ALTER TABLE tbl_name REORGANIZE PARTITION p0 INTO(partition s0 values in(1,2,3), partition s1 values in(4,5));

(2) 合并分區(qū)如:ALTER TABLE tbl_name REORGANIZE PARTITION s0,s1 INTO(partition p0 values in(1,2,3,4,5));

4. 刪除所有分區(qū),但保留數(shù)據(jù),形式:ALTER TABLE tbl_name remove partitioning;

② HASH和KEY分區(qū)的管理

1. 減少分區(qū)數(shù)量語(yǔ)句如:ALTER TABLE tbl_name COALESCE PARTITION 2;

2. 添加分區(qū)數(shù)量語(yǔ)句如:ALTER TABLE tbl_name add PARTITION partitions 2;

③ 其他分區(qū)管理語(yǔ)句

1. 重建分區(qū):類似于先刪除保存在分區(qū)中的所有記錄,然后重新插入它們,可用于整理分區(qū)碎片。如:ALTER table tbl_name REBUILD PARTITION p2,p3;

2. 優(yōu)化分區(qū):如果從分區(qū)中刪除了大量的行,或者對(duì)一個(gè)帶有可變長(zhǎng)度的行(也就是說(shuō),有VARCHAR,BLOB或TEXT類型的列)做了許多修改,可以使用 ALTER TABLE tbl_name OPTIMIZE PARTITION來(lái)收回沒(méi)有使用的空間,并整理分區(qū)數(shù)據(jù)文件的碎片。如:ALTER TABLE tbl_name OPTIMIZE PARTITION p2,p3;

3. 分析分區(qū):讀取并保存分區(qū)的鍵分布,如:ALTER TABLE tbl_name ANALYZE PARTITION p2,p3;

4. 檢查分區(qū):檢查分區(qū)中的數(shù)據(jù)或索引是否已經(jīng)被破壞,如:ALTER TABLE tbl_name CHECK PARTITION p2,p3;

5. 修補(bǔ)分區(qū):修補(bǔ)被破壞的分區(qū),如:ALTER TABLE tbl_name REPAIR PARTITION p2,p3;

十、查看分區(qū)信息

1. 查看分區(qū)信息:select * from information_schema.partitions where table_schema='arch1' and table_name = 'tbl_test' G;

2. 查看分區(qū)上的數(shù)據(jù):select * from tbl_test partition(p0);

3. 查看MySQL會(huì)操作的分區(qū):explain partitions select * from tbl_test where uuid = 2;

十一、 局限性

1. 最大分區(qū)數(shù)目不能超過(guò)1024,一般建議對(duì)單表的分區(qū)數(shù)不要超過(guò)50個(gè)。

2. 如果含有唯一索引或者主鍵,則分區(qū)列必須包含在所有的唯一索引或者主鍵在內(nèi)。

3. 不支持外鍵。

4. 不支持全文索引,對(duì)分區(qū)表的分區(qū)鍵創(chuàng)建索引,那么這個(gè)索引也將被分區(qū)。

5. 按日期進(jìn)行分區(qū)很合適,因?yàn)楹芏嗳掌诤瘮?shù)可以用。但是對(duì)字符串來(lái)說(shuō)合適的分區(qū)函數(shù)不太多。

6. 只有RANGE和LIST分區(qū)能進(jìn)行子分區(qū),HASH和KEY分區(qū)不能進(jìn)行子分區(qū)。

7. 臨時(shí)表不能被分區(qū)。

8. 分區(qū)表對(duì)于單條記錄的查詢沒(méi)有優(yōu)勢(shì)。

9. 要注意選擇分區(qū)的成本,沒(méi)插入一行數(shù)據(jù)都需要按照表達(dá)式篩選插入的分區(qū)。

10. 分區(qū)字段盡量不要可以為null

mysql 查詢結(jié)果,先查含有某字段的數(shù)據(jù),再查其他字段的數(shù)據(jù)

你是說(shuō)類似搜索關(guān)鍵字相關(guān)度排序的問(wèn)題吧,我的想法是做分詞表,按相關(guān)度分配權(quán)重,然后按權(quán)重通過(guò)多條查詢關(guān)鍵字條件拼出結(jié)果來(lái)顯示。比如你舉的例子,我先查詢包含3的數(shù)據(jù),再查詢不包含3的數(shù)據(jù)按升序排列,一起存到臨時(shí)表,再對(duì)這個(gè)臨時(shí)表進(jìn)行輸出。

mysql集群的幾種方案

Asynchronous?Replication?Automatic failover

其原理是在一條異步復(fù)制通道上配置多個(gè)可用復(fù)制源,當(dāng)某個(gè)復(fù)制源不可用時(shí)(宕機(jī)、復(fù)制鏈路中斷),且 slave 的 IO 線程嘗試重連無(wú)效,自動(dòng)根據(jù)權(quán)重選擇新的源繼續(xù)同步。

準(zhǔn)備一個(gè) MGR 集群和單實(shí)例,模擬復(fù)制鏈路切換,當(dāng) primary 故障,slave 自動(dòng)切換到其他節(jié)點(diǎn)。dbdeployer?deploy?replication?--topology=group?8.0.22?--single-primarydbdeployer deploy single 8.0.22

2. 在從機(jī)上建立指向 MGR 主節(jié)點(diǎn)的復(fù)制通道,

change master to master_user='msandbox',master_password='msandbox', master_host='127.0.0.1',master_auto_position=1,source_connection_auto_failover=1,master_port=23223,master_retry_count=6,master_connect_retry=10 for channel 'mgr-single';

在 master_retry_count 和 master_connect_retry 的設(shè)置上要考慮嘗試重連多久才切換復(fù)制源。

3. 在從機(jī)上配置 asynchronous connection auto failover

配置 asynchronous connection auto failover 的兩個(gè)函數(shù):

asynchronous_connection_failover_add_source(channel-name,host,port,network-namespace,weight)

asynchronous_connection_failover_delete_source(channel-name,host,port,network-namespace)

權(quán)重值大的被優(yōu)先級(jí)選擇,可以配合MGR的選舉權(quán)重配置 asynchronous_connection_failover 的權(quán)重。當(dāng) MGR 節(jié)點(diǎn)切換,異步復(fù)制也能切換到新的主節(jié)點(diǎn)。

SELECT asynchronous_connection_failover_add_source('mgr-single','127.0.0.1',23223,null,100); SELECT asynchronous_connection_failover_add_source('mgr-single','127.0.0.1',23224,null,80); SELECT asynchronous_connection_failover_add_source('mgr-single','127.0.0.1',23225,null,50);start?slave?for?channel?'mgr-single';

4. 檢查異步復(fù)制通道是否啟用 failover。

mysql SELECT CHANNEL_NAME, SOURCE_CONNECTION_AUTO_FAILOVER FROM performance_schema.replication_connection_configuration; +--------------+---------------------------------+| CHANNEL_NAME | SOURCE_CONNECTION_AUTO_FAILOVER |+--------------+---------------------------------+|?mgr-single?? |??1??????????????????????????????|+--------------+---------------------------------+1 row in set (0.01 sec

5. 把 MGR 的 primary 節(jié)點(diǎn) kill 掉,這個(gè)從節(jié)點(diǎn)會(huì)在嘗試幾輪重連失敗后自動(dòng)切換到次權(quán)重的復(fù)制源,其日志中會(huì)輸出切換信息。

注意:當(dāng)主節(jié)點(diǎn)故障,一旦復(fù)制鏈路成功 failover 后,在新的復(fù)制鏈路沒(méi)有故障時(shí),如果原主節(jié)點(diǎn)恢復(fù),是不會(huì)回切的。如果當(dāng)前復(fù)制鏈路發(fā)生故障,會(huì)再次選擇權(quán)重高的進(jìn)行切換

分享文章:mysql怎么分權(quán)重 mysql 權(quán)重排序
標(biāo)題URL:http://www.muchs.cn/article32/hggesc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、定制開(kāi)發(fā)、域名注冊(cè)做網(wǎng)站、建站公司自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名