java開發之MySQL資料庫效能優化
一、MySQL實現優化
1)資料庫設計要合理(遵循3F式)
2).新增索引()
索引分為:普通索引、主鍵索引、唯一索引、全文索引
3)分表分庫技術(取模分表、水平分割、垂直分割)
4).讀寫分離
5).儲存過程
6).配置最大連線數
7).伺服器升級
8).隨時清理碎片化
9).SQL語句調優
二、資料庫設計
1).減少冗餘量
2).遵循3F式
三、三正規化
1F:原子約束 每列不可再分
2F:保證唯一性
3F:不要冗餘資料
四、分表分庫
1).垂直切分
將一個專案拆分成多個小專案,每個小專案都有單獨的資料庫,好處是互不影響。
2)水平切分
通過取模演算法,均勻分配
五、定位慢查詢
1)什麼是慢查詢?
MySQL預設慢查詢是10秒,如果10秒後還沒響應回來這種現象稱為慢查詢
2)慢查詢次數命令
show status like ‘slow_queries’;
六、索引
索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式儲存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查詢記錄至少要比順序掃描記錄快100倍
七、索引分類
1)主鍵索引
主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT型別的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在建立表的時候指定,例如“CREATE TABLE tablename ( […], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。
2)唯一索引
索引列的所有值都只能出現一次,即必須唯一。
3)組合索引
4)全文索引
停止詞, 因為在一個文字中,建立索引是一個無窮大的數,因此,對一些常用詞和字元,就不會建立,這些詞,稱為停止詞
5)普通索引
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的資料列建立索引。只要有可能,就應該選擇一個數據最整齊、最緊湊的資料列(如一個整數型別的資料列)來建立索引。
八、索引實現原理
底層通過B叉樹實現,首先建立索引檔案,索引檔案中每個值都有一個下標位置
九、索引會提交效率
索引是一個折半查詢,首先會取一箇中間數,然後左邊為小,右邊為大,如果查詢的資料比它大就找右邊,效率是2的N次方,索引缺點是增加、刪除、索引檔案也會更新
九、儲存引擎
inndb
myisam
memory
十、inndb和myisam的區別
1)批量新增時myisam效率高
2)inndb事務機制安全
3)myisam是表鎖
4)inndb是行鎖
5)myisam支援全文檢索
6)inndb不支援全文檢索
7)都支援B叉樹資料結構
8)支援索引快取
十一、SQL優化技巧
① 使用group by 分組查詢是,預設分組後,還會排序,可能會降低速度,
在group by 後面增加 order by null 就可以防止排序.
explain select * from emp group by deptno order by null;
② 有些情況下,可以使用連線來替代子查詢。因為使用join,MySQL不需要在記憶體中建立臨時表。
select * from dept, emp where dept.deptno=emp.deptno; [簡單處理方式]
select * from dept left join emp on dept.deptno=emp.deptno; [左外連線,更ok!]
③ 對查詢進行優化,要儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引
應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
最好不要給資料庫留 NULL,儘可能的使用 NOT NULL 填充資料庫.
備註、描述、評論之類的可以設定為 NULL,其他的,最好不要使用 NULL。
不要以為 NULL 不需要空間,比如:char(100) 型,在欄位建立時,空間就固定了, 不管是否插入值(NULL 也包含在內),都是佔用 100 個字元的空間的,如果是 varchar 這樣的變長欄位, null 不佔用空間。
可以在 num 上設定預設值 0,確保表中 num 列沒有 null 值,然後這樣查詢:
select id from t where num = 0
十二、MySQL讀寫分離
在資料庫叢集架構中,讓主庫負責處理事務性查詢,而從庫只負責處理select查詢,讓兩者分工明確達到提高資料庫整體讀寫效能。當然,主資料庫另外一個功能就是負責將事務性查詢導致的資料變更同步到從庫中,也就是寫操作。
十三、讀寫分離的好處
1)分攤伺服器壓力,提高機器的系統處理效率
讀寫分離適用於讀遠比寫的場景,如果有一臺伺服器,當select很多時,update和delete會被這些select訪問中的資料堵塞,等待select結束,併發效能並不高,而主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用
2)增加冗餘,提高服務可用性,當一臺資料庫伺服器宕機後可以調整另外一臺從庫以最快速度恢復服務
十四、主從複製原理
依賴於二進位制日誌,binary-log. 二進位制日誌中記錄引起資料庫發生改變的語句
十五、Scale-up與Scale-out區別
Scale Out是指Application可以在水平方向上擴充套件。一般對資料中心的應用而言,Scale out指的是當新增更多的機器時,應用仍然可以很好的利用這些機器的資源來提升自己的效率從而達到很好的擴充套件性。
Scale Up是指Application可以在垂直方向上擴充套件。一般對單臺機器而言,Scale Up值得是當某個計算節點(機器)新增更多的CPU Cores,儲存裝置,使用更大的記憶體時,應用可以很充分的利用這些資源來提升自己的效率從而達到很好的擴充套件性
十六、MyCat
是一個開源的分散式資料庫系統,因為資料庫一般都有自己的資料庫引擎,而Mycat並沒有屬於自己的獨有資料庫引擎,所有嚴格意義上說並不能算是一個完整的資料庫系統,是一個在應用和資料庫之間起橋樑作用的中介軟體