MySQL優(yōu)化(DBA級優(yōu)化)

1.數(shù)據(jù)庫優(yōu)化的可以從如下幾個方面著手:

1.>sql語句和索引.

2.>數(shù)據(jù)庫表結(jié)構(gòu).

3.>系統(tǒng)配置.

4.>硬件

2.使用MySQL的慢查詢?nèi)罩緦π视袉栴}的sql進行監(jiān)控

1.>查看慢查詢?nèi)罩臼欠耖_啟:show variables like 'slow_query_log'?

2.>根據(jù)查看出來的日志存放路徑,開啟慢查詢?nèi)罩緎et global slow_query_log_file='/var/lib/mysql/mylinux-slow.log' (file后面的地址可以通過show variables like '%log%';獲取)

3.>開啟沒有用索引的查詢記錄在日志中:set global log_queries_not_using_indexes=on;

4.>設(shè)置最長的查詢時間,如果超過該時間,則被記錄到日志中.set global long_query_time=1;

3.SQL及索引優(yōu)化.

3.1MySQL自帶的慢查詢?nèi)罩痉治龉ぞ?

mysqldumpslow -h 可以查看相關(guān)參數(shù).

mysqldumpslow -t 3 /var/lib/mysql/mylinux-slow.log | more 查看前3條性能比較差的sql.

3.2專業(yè)的慢查詢分析工具:pt-query-digest.

3.3使用該工具進行查看慢查詢?nèi)罩?pt-query-digest??/var/lib/mysql/mylinux-slow.log | more 查看詳情.

4.通過慢查詢?nèi)罩景l(fā)現(xiàn)有問題的SQL


5.SQL優(yōu)化



5.1 max和count查詢的優(yōu)化

explain select max(box_lunch_time) from cart_personal /G (豎著顯示) 如果查詢數(shù)據(jù)較多,比較慢的話,可以為box_lunch_time做索引,eg:

create index idxboxlunchtime on cart_personal(box_lunch_time);

count函數(shù)中值得注意的: count*會把空值也都計算進去,而count id則不會


5.2子查詢優(yōu)化?

當采用子查詢效率上不如連接查詢時,將子查詢改為連接查詢,但有一點需要值得注意,就是連接查詢不會屏蔽一對多時出現(xiàn)數(shù)據(jù)重復(fù)的情況,此時如果業(yè)務(wù)需要,可以采用distinct關(guān)鍵字來處理.

eg: select * from t where t.id in (select t1.tid from t1);

可以用: select? t.id from t? join t1 on t.tid =t1.tid;代替,當t1中的tid有兩條相同的數(shù)據(jù)時,那么第一條查詢語句查詢出來的結(jié)果包只含1條數(shù)據(jù),而第二條查詢語句能查出2條數(shù)據(jù),此時可以改為:

select? distinct t.id from t? join t1 on t.tid =t1.tid; 這樣查詢結(jié)果就與第一條sql查詢結(jié)果一致了!

5.3group by 優(yōu)化

優(yōu)化前:


優(yōu)化后:


5.4 limit查詢優(yōu)化

優(yōu)化前:


優(yōu)化步驟一:

在order by操作中,盡量使用主鍵或者索引列來進行order by,這樣效率高.


優(yōu)化步驟二:

如果數(shù)據(jù)量比較大時,Limit50000就要掃描500000次,IO比較大,因此需要進一步優(yōu)化.值得注意的是,在這種情況下,id必須是連續(xù)的,順序增長的,如果Id不連續(xù),需要添加一列,idindex,保證它是自增且連續(xù)的,為它添加索引,即可.

6.索引優(yōu)化

6.1如何選擇合適的列建立索引?

1.在where從句,group by從句,order by從句 on從句中出現(xiàn)的列建立索引

2.索引字段越小越好

3.離散度大的列放到聯(lián)合索引的前面.(如何判斷離散度? 可以使用count語句,比如兩個字段staff_id和customer_id,可以使用select count? distinct(staff_id), count distinct(customer_id) from payment; 查詢結(jié)果中對應(yīng)的數(shù)字越大,說明離散度越大)


6.2索引優(yōu)化sql的方法

1.重復(fù)索引


2.冗余索引


3.如何查詢出重復(fù)索引和冗余索引?

SELECT a.TABLE_SCHEMA, a.TABLE_NAME, a.COLUMN_NAME,

a.INDEX_NAME AS 'index1', b.INDEX_NAME AS 'index2'

FROM information_schema.STATISTICS a

JOIN information_schema.STATISTICS b

ON a.TABLE_SCHEMA = b.TABLE_SCHEMA? ?

AND a.TABLE_NAME = b.TABLE_NAME

AND a.SEQ_IN_INDEX = b.SEQ_IN_INDEX?

AND a.COLUMN_NAME = b.COLUMN_NAME

WHERE a.SEQ_IN_INDEX = 1 AND a.INDEX_NAME <> b.INDEX_NAME

4.查找重復(fù)/冗余索引的工具:pt-duplicate-key-checker 工具檢查重復(fù)及冗余索引

下載地址:http://www.percona.com/redir/downloads/percona-toolkit/percona-toolkit-1.0.1.tar.gz

安裝方法:

先安裝依賴:yum?install?-y?perl?perl-IO-Socket-SSL?perl-DBD-MySQL?perl-Time-HiRes?perl-Digest-MD5?perl-ExtUtils-MakeMaker

然后進入解壓后的目錄 執(zhí)行:

perl Makefile.PL;make;make install

使用:pt-duplicate-key-checker --host=localhost --user=root --password=123456 --database=ordering 進行查詢,根據(jù)查詢出的結(jié)果和工具給出的建議進一步優(yōu)化索引.

4.索引維護

pt-index-usage --host=localhost --user=root --password=123456 /var/lib/mysql/mylinux-slow.log

刪除那些不經(jīng)常使用的索引.

7.數(shù)據(jù)庫表結(jié)構(gòu)的優(yōu)化


7.1用Int來存儲時間?


7.2用bigint來存儲Ip地址



7.3范式優(yōu)化

主要優(yōu)化第三范式,也就是傳遞依賴,不優(yōu)化的話會造成數(shù)據(jù)冗余,插入異常,更新,刪除等異常.

第三范式定義:要求數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任意候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式.

比如下圖這個列子:

因此可以對表進行拆分 ,把具有傳遞函數(shù)依賴的字段拆分開來,以上圖例子為例,拆分后符合要求的表結(jié)構(gòu)如下:

7.4 反范式化

在實際開發(fā)中,為了提高查詢效率,可以把原本符合第三范式的表適當增加冗余,這樣的話就可以達到優(yōu)化查詢效率的目的,原本需要關(guān)聯(lián)三張表的操作可以在一到兩張表里完成,是一種犧牲空間來換取時間的操作.

7.5數(shù)據(jù)庫表的垂直拆分


7.6數(shù)據(jù)庫表的水平拆分


8.數(shù)據(jù)庫系統(tǒng)配置的優(yōu)化

8.1操作系統(tǒng)配置優(yōu)化


8.2Mysql的配置文件優(yōu)化



8.3第三方配置工具來配置mysql


關(guān)于該工具的使用更多的可以參考這里:https://www.imooc.com/video/4165

9.硬件優(yōu)化



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容