java面試——資料庫優化方面
一、定位:查詢、定位慢查詢
1、查詢並定位慢查詢
在專案自驗轉測試之前,在啟動mysql時開啟慢查詢,並且把執行慢的語句寫到日誌中,在執行一定的時間後,查詢日誌。通過檢視日誌,找到慢查詢語句。使用explain,來詳細分析語句的問題。
二、優化手段
1、使用索引
建立合適的索引,就可以在索引中查詢,查詢到以後直接找相對應的記錄
①索引是什麼 —— 一種幫助DBMS高效獲取資料的資料結構
②分類
普通索引:允許重複值出現
唯一索引:不能有重複的記錄,其它與普通索引相同
主鍵索引:隨著設定主鍵而建立的,唯一且沒有null值
全文索引:對錶中文字域進行索引,只在myisam中有效
缺點:
①、佔用磁碟空間
②、使dml(插刪改)變慢
因此如果不查詢的欄位,建立索引就無意義,不是隻有幾個值的欄位,變化不頻繁的欄位,也不使用索引。
2、分表
當一張表的資料比較多,或者一些表的欄位的值比較多,我們就可以水平分表,或者垂直分表來優化。
①、水平分表
根據經驗,當Mysql資料到達百萬級別,查詢效率會很低,容易造成表鎖,堆積連線,直到掛掉,因此水平分表能減少壓力。
(1)、按時間分表--時效性較強
(2)、按區間分表
(3)、hash分表
②、垂直分表
很少情況下會查詢,欄位值又多,就把多的欄位通過外來鍵關聯,單獨分到一個表中。
3、讀寫分離
一臺伺服器不能滿足要求,採用讀寫分離的方式進行叢集。
一臺資料庫支援的最大併發連線數是有限的,如果使用者併發訪問太多,一臺伺服器滿足不了要求時,就可以叢集處理。其中讀寫分離是最常用的叢集技術。
①、確保主從要同步
確保不同資料庫伺服器的資料是一致的。 能改變資料庫的操作都往主資料庫去寫。其它的資料庫從主資料庫上同步資料。
②、使用負載均衡
使用負載均衡來實現寫的操作都往主資料庫去,而讀的操作都往從資料庫。
4、使用快取技術
在持久層,和資料庫之間新增一個快取層。 使用者訪問時,可以直接從快取中獲取。
①、memcached 不支援分散式快取
②、使用redis來做中央快取
5、SQL語句優化
①、批量插入資料,先去除鍵,操作完成後,再恢復。
②、關閉唯一效驗
③、修改事務的提交方式
④、變多次提交為一次
⑤、Order by多使用索引排序
⑥、確保on上面的欄位有索引
⑦、明確寫出要查詢的列,儘量不使用*
⑧、儘量不要在where裡面使用不等號或者null值判斷,或者使用like,會導致全表掃描
⑨、可使用exist代替in
三、選擇合適的儲存引擎
1、MyISAM儲存引擎
對事務要求不高,同時以查詢和新增為主,查詢新增
2、INNODB
對事務要求高,儲存的都是重要資料
3、Memory
資料變換頻繁,不需入庫,速度極快,查詢修改