分類
數(shù)據(jù)庫優(yōu)化主要有4個(gè) 方面
- sql以及索引
結(jié)構(gòu)良好的sql 毁涉,建立有效的索引,適量配紫,結(jié)構(gòu)良好的sql垂蜗,選擇結(jié)構(gòu)最優(yōu)的sql,是最多的優(yōu)化方式翘鸭,
- 數(shù)據(jù)庫表結(jié)構(gòu)
根據(jù)范式設(shè)計(jì)表結(jié)構(gòu),盡量減少 冗余戳葵,對(duì)查詢有益就乓, - 系統(tǒng)配置
在Linux系統(tǒng)下面,tcp連接數(shù)拱烁,打開文件數(shù)限制档址,最重要的就是文件數(shù),表都是文件邻梆,打開表就是打開文件守伸,如果上限就不行了 - 硬件
內(nèi)存越大,數(shù)據(jù)庫性能越好浦妄,cpu核數(shù)越多不一定越好尼摹,IO設(shè)備對(duì)數(shù)據(jù)庫影響很大
數(shù)據(jù)庫sql優(yōu)化
-
如何發(fā)現(xiàn)有問題的sql
使用慢查詢?nèi)罩緦?duì)有效率問題的sql進(jìn)行監(jiān)控,
image.png
有查詢執(zhí)行信息剂娄,執(zhí)行時(shí)間蠢涝,內(nèi)容,主機(jī)信息
-
慢查詢?nèi)罩痉治?br> mysqldumpslow 工具阅懦,pt-query-digest慢查日志分析工具
其中pt-query-digest分析頁面如下
image.png- explain 命令
explain select count(*) from user;
可以看出加不加索引會(huì)明顯變化掃描的行數(shù)
- explain 命令
- 子查詢優(yōu)化和二,把子查詢優(yōu)化為用join鏈接的查詢,如可以把
select * from t where t.id in (select t1.tid from t1);
變?yōu)?/p>
select * from t join t1 on t.id=t1.tid;
注意:當(dāng)t1出現(xiàn)重復(fù)的時(shí)候耳胎,上面會(huì)出現(xiàn)兩個(gè)重復(fù)的結(jié)果惯吕,加上distinct命令即可
- Group By 優(yōu)化
- limit查詢優(yōu)化
limit一般會(huì)伴隨order by從句使用
- 一般用主鍵來作為order by排序字段,因?yàn)橹麈I一般都有索引怕午,索引已經(jīng)排好序了
- 記錄上次返回的主鍵废登,在下次查詢時(shí)使用主鍵過濾
- 索引優(yōu)化
- 如何選擇合適的列建立索引
- 在where從句,group by 從句郁惜,order by 從句堡距,on從句中出現(xiàn)的列
- 索引字段越小越好
- 離散度大的列放在聯(lián)合索引前面,離散度就是不一樣個(gè)數(shù)占總個(gè)數(shù)的比重
- 索引的維護(hù)及優(yōu)化---重復(fù)及冗余索引
去除冗余的索引,不需要的索引
數(shù)據(jù)庫表結(jié)構(gòu)優(yōu)化
選擇合適的數(shù)據(jù)類型
范式化和反范式化
范式化是為了減少數(shù)據(jù)冗余羽戒,節(jié)省空間
反范式化是為了用空間換取時(shí)間缤沦,提高sql查詢的效率,節(jié)約時(shí)間-
表的垂直拆分
所謂垂直才分易稠,就是把原來一個(gè)有很多列的表拆分成多個(gè)表疚俱,這解決了表的寬度問題。通常垂直拆分可以按照以下原則進(jìn)行:- 把不常使用的字段單獨(dú)存放到一個(gè)表中
- 把大字段獨(dú)立存放到一個(gè)表中
- 把經(jīng)常一起使用的字段放到一起
表的水平拆分
按照id進(jìn)行hash散列缩多,水平拆分
這樣會(huì)造成一個(gè)問題呆奕,就是有些后臺(tái)統(tǒng)計(jì)業(yè)務(wù)需要夸分區(qū)統(tǒng)計(jì),我們可以用一個(gè)匯總表來統(tǒng)計(jì)衬吆,因?yàn)楹笈_(tái)業(yè)務(wù)時(shí)效性沒有那么急迫梁钾,把前后臺(tái)業(yè)務(wù)拆分。有助于系統(tǒng)分類處理逊抡,統(tǒng)計(jì)以及報(bào)表操作
系統(tǒng)配置優(yōu)化
- 操作系統(tǒng)優(yōu)化
打開文件數(shù)量的限制等內(nèi)容 - Mysql數(shù)據(jù)庫本身的配置優(yōu)化
一般使用配置文件的方式來配置數(shù)據(jù)庫
innodb_buffer_pool_size 參數(shù)姆泻,是innodb的緩沖池的大小
innodb_buffer_pool_instances 緩沖池的個(gè)數(shù),增加查詢并發(fā)性冒嫡,在5.5版本以后的
innodb_flush_log_at_trx_commit,對(duì)IO效率影響很大拇勃,緩沖區(qū)刷入磁盤的策略
innodb_file_per_table,關(guān)鍵參數(shù),控制每個(gè)表使用獨(dú)立的表空間
服務(wù)器硬件優(yōu)化
如何選擇CPU?
- Mysql有些工作只能使用單核
- mysql有最大利用cpu核數(shù)限制孝凌,超過之后沒有用處