下文主要給大家?guī)?lái)MySQL數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)正常優(yōu)化,希望這些內(nèi)容能夠帶給大家實(shí)際用處,這也是我編輯MySQL數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)正常優(yōu)化這篇文章的主要目的。好了,廢話不多說(shuō),大家直接看下文吧。
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、雁山網(wǎng)絡(luò)推廣、成都微信小程序、雁山網(wǎng)絡(luò)營(yíng)銷、雁山企業(yè)策劃、雁山品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供雁山建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
前言:
在一個(gè)網(wǎng)站架構(gòu)中,首先出現(xiàn)瓶頸的一定是數(shù)據(jù)庫(kù),其次是存儲(chǔ)。
1、硬盤優(yōu)化:不用虛擬機(jī),用物理機(jī)(因?yàn)閿?shù)據(jù)庫(kù)是 IO 密集型的應(yīng)用)
a、CPU 64位CPU,百度為例:一臺(tái)機(jī)器 8-16 顆 CPU。普通公司:2-4顆 cpu。
b、內(nèi)存(mem) 百度為例: 96G-128G,3-4個(gè)實(shí)例。普通公司:32G-64G,跑2個(gè)實(shí)例。
c、磁盤(disk) 數(shù)量越多越好。性能:SSD(高并發(fā)) > SAS(普通業(yè)務(wù)線上) > SATA(線下)
raid 4塊盤:raid0 > raid10 > raid5 > raid1
d、網(wǎng)卡 多塊網(wǎng)卡bond,以及buffer,tcp優(yōu)化。
2、軟件優(yōu)化
操作系統(tǒng):x86_64系統(tǒng)
軟件:mysql 編譯優(yōu)化
3、my.cnf 里參數(shù)的優(yōu)化
注意:my.cnf 里參數(shù)優(yōu)化的幅度很小,大部分架構(gòu)以及SQL語(yǔ)句優(yōu)化。
思想:
監(jiān)控:生產(chǎn)參數(shù)是一般情況下參數(shù)。
命令監(jiān)控:show global status\G
調(diào)優(yōu)工具:mysqlreport
案例:一些MySQL的錯(cuò)誤skip-name-resolve:
http://blog.chinaunix.net/uid-7354272-id-2643611.html
4、SQL語(yǔ)句的優(yōu)化
a、索引優(yōu)化
1)、白名單機(jī)制---百度,項(xiàng)目開(kāi)發(fā),DBA參與,減少上線后的慢SQL數(shù)量。
抓出慢SQL,配置 my.cnf
long_query_time = 2
log-slow-queries=/data/3306/slow-log.log
按天輪詢:slow-log.log
2)、慢查詢?nèi)罩痉治龉ぞ?----mysqlsla(推薦)
MySQLdumpslow,mysqlsla,myprofi,mysql-explain-slow-log,mysqllogfilter 比較
3)、每天晚上0點(diǎn)定時(shí)分析慢查詢,發(fā)到核心開(kāi)發(fā),DBA分析及高級(jí)運(yùn)維,CTO的郵箱里。
DBA分析給出優(yōu)化建議--->核心開(kāi)發(fā)確認(rèn)更改--->DBA線上操作處理。
b、大的復(fù)雜的SQL語(yǔ)句拆分成多個(gè)小的SQL語(yǔ)句。
子查詢,join連表查詢,某個(gè)表4000萬(wàn)條記錄。
c、數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的地方,但是不是計(jì)算數(shù)據(jù)的地方。
對(duì)數(shù)據(jù)計(jì)算,應(yīng)用類處理,都要拿到前端應(yīng)用解決。禁止在數(shù)據(jù)庫(kù)上處理。
d、搜索功能,like‘%老男孩%’,一般不要用mysql 數(shù)據(jù)庫(kù)。
SQL 語(yǔ)句的詳細(xì)優(yōu)化細(xì)節(jié):
① 能用定長(zhǎng) char 類型的就不用 varchar 類型。
② 數(shù)據(jù)庫(kù)查詢盡量不用 select ,除非要查所有字段。
mysql> select id,name from test; 不用mysql> select from test;
③ select 查詢的時(shí)候,where 條件后面的列類型如果是字符串類型就要加引號(hào),如果是數(shù)字類型就不要加引號(hào)。
④ 如果一個(gè)條件列的前 n 個(gè)字符已經(jīng)接近唯一值,就可以對(duì)一個(gè)列的前 n 個(gè)字符創(chuàng)建索引,不需要對(duì)整個(gè)列創(chuàng)建索引了。
⑤ 可以創(chuàng)建聯(lián)合索引,但要注意前綴特性。如果要做復(fù)合索引,要把最常用的當(dāng)做常用條件列的字段放在前面。
⑥ 可以用 explain 查看 select 語(yǔ)句執(zhí)行計(jì)劃,慢查詢?nèi)罩净蛘?show full processlist 某語(yǔ)句長(zhǎng)時(shí)間可以看到。
⑦ 能批量插入就批量插入,不要逐條插入。
mysql> insert into test values(1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka');
⑧ 使用 set profiles 查看 SQL 語(yǔ)句的執(zhí)行細(xì)節(jié)。
5、架構(gòu)上的優(yōu)化
1)、業(yè)務(wù)拆分:搜索功能,like‘%老男孩%’,一般不要用mysql 數(shù)據(jù)庫(kù)。
2)、業(yè)務(wù)拆分:某些業(yè)務(wù)應(yīng)用使用 NOSQL 持久化存儲(chǔ),例如:memcahcedb,redis,ttserver
粉絲關(guān)注,好友關(guān)系等等。
3)、數(shù)據(jù)庫(kù)前端必須要加 cache,例如:memcached,用戶登錄,商品查詢。
4)、動(dòng)態(tài)的數(shù)據(jù)靜態(tài)化。整個(gè)文件靜態(tài)化,頁(yè)面片段靜態(tài)化。
5)、數(shù)據(jù)庫(kù)集群與讀寫分離。一主多從,通過(guò)程序或者 dbproxy 進(jìn)行集群讀寫分離。
6)、單表超過(guò)2000萬(wàn)。拆庫(kù)拆表,人工拆庫(kù)拆表(登錄、商品、訂單)
7)、百度,阿里國(guó)內(nèi)前×××司,會(huì)這樣搞。
6、流程、制度,安全優(yōu)化
任何一次人為數(shù)據(jù)庫(kù)記錄的更新,都要走一個(gè)流程:
a、人的流程:開(kāi)發(fā)-->核心開(kāi)發(fā)-->運(yùn)維或DBA
b、測(cè)試流程:內(nèi)網(wǎng)測(cè)試-->IDC測(cè)試-->線上執(zhí)行
c、客戶端管理,phpmyadmin
有關(guān) mysql 的 innodb_flush_log_at_trx_commit 參數(shù):
innodb_flush_log_at_trx_commit = 1
參數(shù)解釋:
0:log buffer 將每秒一次地寫入 log file 中,并且 log file 的 flush ( 刷到磁盤 )操作同時(shí)進(jìn)行。該模式下在事務(wù)提交的時(shí)候,不會(huì)主動(dòng)觸發(fā)寫入磁盤的操作。
1:每次事務(wù)提交時(shí)MySQL都會(huì)把log buffer的數(shù)據(jù)寫入log file,并且 flush ( 刷到磁盤 ) 中去,該模式為系統(tǒng)默認(rèn)。
2:每次事務(wù)提交時(shí) MySQL 都會(huì)把 log buffer 的數(shù)據(jù)寫入 log file,但是 flush ( 刷到磁盤 ) 操作并不會(huì)同時(shí)進(jìn)行。該模式下,MySQL 會(huì)每秒執(zhí)行一次 flush ( 刷到磁盤 ) 操作。
參數(shù)修改:
找到 mysql 配置文件 mysql.cnf,修改成合適的值,然后重啟 mysql。
注意事項(xiàng):
當(dāng)設(shè)置為0,該模式速度最快,但不×××全,mysqld進(jìn)程的崩潰會(huì)導(dǎo)致上一秒鐘所有事務(wù)數(shù)據(jù)的丟失。
當(dāng)設(shè)置為1,該模式是最安全的,但也是最慢的一種方式。在mysqld 服務(wù)崩潰或者云服務(wù)器主機(jī)crash的情況下,binary log 只有可能丟失最多一個(gè)語(yǔ)句或者一個(gè)事務(wù)。。
當(dāng)設(shè)置為2,該模式速度較快,也比0安全,只有在操作系統(tǒng)崩潰或者系統(tǒng)斷電的情況下,上一秒鐘所有事務(wù)數(shù)據(jù)才可能丟失。
對(duì)于以上關(guān)于MySQL數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)正常優(yōu)化,大家是不是覺(jué)得非常有幫助。如果需要了解更多內(nèi)容,請(qǐng)繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會(huì)喜歡上這些內(nèi)容的。