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)化

