通過此文檔對Mysql數(shù)據(jù)庫及IBATIS使用過程中的常見問題和優(yōu)化方式進(jìn)行簡單提示性描述,指導(dǎo)研發(fā)人員正確的設(shè)計(jì)和使用數(shù)據(jù)庫它改,提高程序運(yùn)行質(zhì)量疤孕。
一、Mysql數(shù)據(jù)庫性能指標(biāo)參數(shù)
1央拖、 IO
解釋:IO有四種類型:連續(xù)讀祭阀,隨機(jī)讀,隨機(jī)寫和連續(xù)寫鲜戒,連續(xù)讀寫的IO size通常比較大专控,主要衡量吞吐量,而隨機(jī)讀寫的IO size比較小遏餐,主要衡量IOPS和響應(yīng)時(shí)間伦腐。數(shù)據(jù)庫中的全表掃描是連續(xù)讀IO,索引訪問則是典型的隨機(jī)讀IO失都,日志文件是連續(xù)寫IO柏蘑,而數(shù)據(jù)文件則是隨機(jī)寫IO。
目標(biāo):盡量減少查詢中的IO次數(shù)粹庞、提高IOPS咳焚、加快IO響應(yīng)時(shí)間
盡量集中寫,提高吞吐量庞溜。
2革半、 CPU
解釋:數(shù)據(jù)庫在進(jìn)行order by,group by,distinct等時(shí)將進(jìn)行大量的cpu計(jì)算,造成cpu繁忙
目標(biāo):降低CPU計(jì)算
二、Mysql數(shù)據(jù)庫使用建議
1又官、 使用并正確使用索引
單列索引(where延刘、order by、join on等字段)六敬、復(fù)合索引(最左前綴原則碘赖,where和orderby同時(shí)出現(xiàn)時(shí))、在索引中完成查詢觉阅、在索引中完成排序崖疤、
2、 Mysql使用Nested Loop Join典勇,永遠(yuǎn)用小結(jié)果集驅(qū)動(dòng)大的結(jié)果集劫哼,并減少嵌套循環(huán)總次數(shù)
3、 根據(jù)實(shí)際情況確定先過濾數(shù)據(jù)再排序還是先排序再過濾數(shù)據(jù)(舉例:先分頁再JOIN)
4割笙、 盡量避免select *而只選取自身需要的Column
5权烧、 避免大量復(fù)雜Join,適度分拆對象
6伤溉、 使用join代替子查詢般码,盡量不使用mysql中的子查詢
7、 盡量少使用OR,使用union或者union all來代替or
8乱顾、 牢記在一次數(shù)據(jù)訪問中一般只能利用一個(gè)索引板祝,where多條件請使用復(fù)合索引而不是建多個(gè)單列索引
9、 更新頻繁的字段不適合創(chuàng)建索引
10走净、
使用不等于(<>或者!=)的時(shí)候,Mysql無法使用索引
11券时、
使用Like操作的時(shí)候如果條件以通配符開始(如%abc…)Mysql無法使用索引
12、
合理正確的使用應(yīng)用層緩存
13伏伯、
InnoDB會產(chǎn)生死鎖橘洞,死鎖通常都可以在應(yīng)用設(shè)計(jì)層面解決,通過調(diào)整業(yè)務(wù)流程说搅、數(shù)據(jù)庫對象設(shè)計(jì)炸枣、事務(wù)大小,以及訪問數(shù)據(jù)庫的SQL語句弄唧,絕大部分死鎖都可以避免适肠,可采用不會話中順序訪問表,批量處理數(shù)據(jù)時(shí)事先對數(shù)據(jù)排序等方式解決死鎖問題候引。
14迂猴、
正確使用悲觀鎖(for update)和樂觀鎖(版本比對)機(jī)制解決數(shù)據(jù)沖突問題
三、數(shù)據(jù)庫設(shè)計(jì)優(yōu)化建議
1背伴、 對不經(jīng)常變化的數(shù)據(jù)可進(jìn)行適當(dāng)冗余,從而盡量減少Join
2、 通過選用更“小”的數(shù)據(jù)類型減少存儲空間傻寂,使查詢相同數(shù)據(jù)需要的IO資源降低
3息尺、 通過合適的數(shù)據(jù)類型加速數(shù)據(jù)的比較
四、 Mysql數(shù)據(jù)庫使用調(diào)優(yōu)方式
1疾掰、 Explain:使用explain命令查看SQL語句的執(zhí)行計(jì)劃
可訪問以下地址學(xué)習(xí):
http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#explain
http://isky000.com/database/mysql-explain-detail
2搂誉、 Query Profiler:使用SHOW PROFILE ***命令查看SQL語句執(zhí)行時(shí)CPU和IO統(tǒng)計(jì)細(xì)節(jié),比較不同SQL語句的系統(tǒng)消耗情況
可訪問一下地址學(xué)習(xí):
http://dev.mysql.com/doc/refman/5.1/en/show-profiles.html
五静檬、 數(shù)據(jù)庫及IBATIS使用中常見問題說明(待補(bǔ)充)
1炭懊、索引是不是越多越好?