有關(guān)mysql的一些小技巧
1. 大批量亂序數(shù)據(jù)導(dǎo)入InnoDB很慢如何解決?
InnoDB因?yàn)橹麈I聚集索引的關(guān)系,如果沒有主鍵或者主鍵非序列的情況下,導(dǎo)入會(huì)越來越慢,如何快速的遷移數(shù)據(jù)到InnoDB?借助MyISAM的力量 是很靠譜的,先關(guān)閉InnoDB的Buffer Pool,把內(nèi)存空出來,建一張沒有任何索引的MyISAM表,然后只管插入吧,concurrent_insert=2,在文件末尾并發(fā)插入,速度剛剛 的,插入完成后,ALTER TABLE把索引加上,記得還有ENGINE=InnoDB,就把MyISAM轉(zhuǎn)到InnoDB了,這樣的速度遠(yuǎn)比直接往InnoDB里插亂序數(shù)據(jù)來得快。
2. 在基于ROW的雙Master復(fù)制下,如何快速大批量訂正?
在A<->B的雙Master結(jié)構(gòu)下,假設(shè)只有一臺(tái)提供服務(wù),這是我們常用的架構(gòu),需要大批量訂正數(shù)據(jù),如何做最快?用存儲(chǔ)過程一批批提交?這有很多的限制,有時(shí)候并不可以把一條或多條SQL拆成幾段,怎么辦呢?binlog不是很好的工具嘛?! ROW格式的binlog,Slave在應(yīng)用時(shí)是直接使用Handler API,并沒有走SQL解析,速度非??欤旧鲜荌O操作了,那么我們可以在備庫上直接執(zhí)行訂正SQL,產(chǎn)生的ROW binlog傳到主機(jī),就會(huì)很快訂正完,基本上都比寫存儲(chǔ)過程快。
3. ROW格式Replication如何實(shí)現(xiàn)不帶庫名的replicate-do-db?
雖然MySQL有replicate-do-db這個(gè)參數(shù),但是在ROW格式的binlog下必須使用”db.table”的方式才能生效,USE對(duì)ROW格式是無效的?,F(xiàn)在我有一個(gè)Instance,只需要復(fù)制Master的某幾個(gè)庫,但是是ROW格式,SQL都 沒有使用db前綴,怎么辦?可以這么做,把主庫需要的庫導(dǎo)出來,不需要的庫導(dǎo)出結(jié)構(gòu)即可,在Slave導(dǎo)入這些數(shù)據(jù)及結(jié)構(gòu),配置skip-slave- errors=all,這樣Master復(fù)制過來的binlog,只要發(fā)現(xiàn)有庫有表結(jié)構(gòu),就不會(huì)報(bào)找不到表,就不會(huì)阻塞復(fù)制,但是 UPDATE/DELETE過來沒有數(shù)據(jù)也會(huì)被跳過錯(cuò)誤,間接的實(shí)現(xiàn)了replicate-do-db。
4. A<–>B–>C–>D結(jié)構(gòu)切換到A<–>B, C<–>D結(jié)構(gòu)出現(xiàn)Slave_lag一直增常如何避免?
這種情況常見與一個(gè)雙Master集群分離出一套雙Master集群,例如從原集群分離一部分庫。過快的切換B–>C到C<–>D容易導(dǎo)致主備出現(xiàn)slave_lag,并且一直增長,原因在于A<–>B集群產(chǎn)生的SQL,隨同server_id帶到了C–>D這個(gè)M-S中,當(dāng)A,B產(chǎn)生的SQL在C,D還沒消化完成就CHANGE MASTER為C<–>D時(shí),會(huì)導(dǎo)致這寫SQL在C,D之間來回傳輸,因?yàn)镃,D都認(rèn)為這個(gè)SQL不是自己產(chǎn)生的,因而不銷毀,自己執(zhí)行后寫入binlog,于是Slave_Lag就一直增長。
避免的方法很簡單,部分寫切到C后,先斷開B–>C的復(fù)制,等一會(huì),看D上已經(jīng)沒有Slave_Lag了,再CHANGE MASTER為C<–>D,這樣A,B傳過來的SQL都消化完了。
5. 表中存在很多重復(fù)數(shù)據(jù)時(shí),如何刪除這些重復(fù)數(shù)據(jù)最快?
在需要給表中某些字段加唯一索引時(shí),而字段中又存在需要重復(fù)清理數(shù)據(jù)的問題,不少DBA都應(yīng)該遇到過。一般在處理時(shí)總是想在數(shù)據(jù)庫中只保留一條,其他的刪除,但是這樣的SQL寫出來總是效率不高,怎么辦?其實(shí)可以轉(zhuǎn)換思路,把重復(fù)的都選出一條出來,存到一張臨時(shí)表,然后刪除原表中所有存在重復(fù)的,再把臨時(shí)表的數(shù)據(jù)庫全部插入原庫,這是比較通用并且高效的做法。
相關(guān)文章
MySQL單表百萬數(shù)據(jù)記錄分頁性能優(yōu)化技巧
自己的一個(gè)網(wǎng)站,由于單表的數(shù)據(jù)記錄高達(dá)了一百萬條,造成數(shù)據(jù)訪問很慢,Google分析的后臺(tái)經(jīng)常報(bào)告超時(shí),尤其是頁碼大的頁面更是慢的不行2016-08-08
最新MySQL數(shù)據(jù)庫漏洞情況通報(bào)
本文是對(duì)近期mysql報(bào)出的漏洞情況進(jìn)行了簡單的說明以及漏洞的修復(fù)措施分享,有需要的小伙伴一定要關(guān)注下2016-09-09
MySQL統(tǒng)計(jì)今日生成create_time的數(shù)據(jù)量的方法小結(jié)
create_time通常是一個(gè)用于表示某個(gè)實(shí)體或事件創(chuàng)建時(shí)間的字段,在數(shù)據(jù)庫設(shè)計(jì)、日志記錄或許多軟件系統(tǒng)中常見,它存儲(chǔ)的是一個(gè)日期或時(shí)間戳,記錄了數(shù)據(jù)首次被創(chuàng)建的具體時(shí)刻,本文介紹了MySQL統(tǒng)計(jì)今日生成create_time的數(shù)據(jù)量的方法,需要的朋友可以參考下2024-08-08
mysql創(chuàng)建表分區(qū)的實(shí)現(xiàn)示例
表分區(qū)是指根據(jù)一定規(guī)則,將數(shù)據(jù)庫中的一張表分解成多個(gè)更小的,容易管理的部分,本文主要介紹了mysql創(chuàng)建表分區(qū)的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-01-01
MySQL OOM 系統(tǒng)二 OOM Killer
前面一節(jié)重點(diǎn)分享了Linux的內(nèi)存分配策略,基于上述的分配策略,為了規(guī)避超售的風(fēng)險(xiǎn),Linux采了一種OOM Killer的機(jī)制,即系統(tǒng)可用內(nèi)存(包括Swap)即將使用完之前,選擇性的Kill掉一些進(jìn)程以求釋放一些內(nèi)存2016-07-07

