Mysql
目錄
1.7-jdbc的PreparedStatement相比Statement的好處
1.1-數據庫的分類以及常用的數據庫
分爲:關係型數據庫和非關係型數據庫
- 關係型數據庫:Mysql,oracle,sqlserver
- 非關係型數據庫:redis,memcache,mogodb,hadoop等
1.2-關係數據庫的三範式
範式:範式就是規範,關係型數據庫在設計表時,要遵循的三個規範。要想滿足第二範式必須先滿足第一範式,要滿足第三範式必須先滿足第二範式
-
第一範式:是指數據庫的每一列都是不可分割的基本數據項,同一列中不能有多個值,也就是實體類中的某個屬性不能有多個值或者不能有重複的屬性,列數據不可分割
-
第二範數:要求數據庫中每個實例或行必須可以被唯一區分的,數據庫中所有非主鍵字段完全依賴主鍵,不能產生部分依賴,以存儲各個實例的唯一標識(主鍵)
-
第三範式:要求一個數據庫表中不包含其他表中已經包含的非關鍵字信息(外鍵)
1.3-事務的四個基本特徵
事務:是一個併發控制的單位,比如是用戶定義的一個操作序列,這些操作要麼都做,要麼都不做,是一個不可分割的工作單位
事務必須滿足四大特徵:
-
原子性:表示操作事務內操作不可分割,要們都成功,要們都失敗
-
一致性:要麼成功,要們失敗,失敗了要對前面的操作進行回滾
-
隔離性:一個事務開始後,不能背其他的事務干擾
-
持久性/持續性:表示事務開始了,就不能終止
1.4-Mysql數據庫的最大連接數
特定服務器上面的數據庫只能支持一定數目同時連接,這時我們一般都會設置最大連接數(最多同時服務多少連接),在數據庫安裝時都會有一個默認的最大連接數。
最大連接數爲100
1.5-對jdbc的理解
Java只定義接口,讓數據庫廠商自己實現接口,對於開發而言,只需要導入對應廠商開發的實現即可,然後以接口實現即可,然後進行調用(mysql+mysql驅動(實現)+jdbc)
1.6-jdbc怎麼調用存過程
- 加載 jdbc 驅動程序
- DriverManager.getConnection獲取連接
- 創建一個Statement
- 執行SQL語句
- 處理執行完SQL之後的結果
- 釋放連接
public static void test() throws ClassNotFoundException, SQLException{
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/ssmidea?serverTimezone=UTC
String user = "root";
String password = "root";
//1.註冊驅動
Class.forName(driver);
//2.建立連接
Connection conn=DriverManager.getConnection(url,user,password);
//3.創建語句執行對象
Statement st=conn.createStatement();//創建Statement
//4.執行語句
ResultSet rs=st.executeQuery("select * from user");
//5.處理結果
while(rs.next()){
System.out.print(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3)+"\t");
}
//6.釋放資源,資源rs、st、conn的釋放順序與創建順序相反
rs.close();
st.close();
conn.close();
}
1.7-jdbc的PreparedStatement相比Statement的好處
-
PreparedStatement是預編譯的,速度比Statement快
-
代碼可讀性和可維護性
-
安全性,PreparedStatement可以防止sql注入攻擊,而statement不行
1.8-數據庫連接池的作用
1:限定數據庫連接的個數,不會導致由於數據庫連接過多導致系統運行緩慢或者崩潰
2:數據庫連接不需要每次都去創建或者銷燬,節約了資源
3:數據庫連接不需要每次都要去創建,響應時間更快
1.9-數據庫優化手段
-
創建索引:創建合適的索引,我們就可以在索引中查詢,查詢到以後直接找對應的記錄
-
分表:當一張表的數據比較多或一張表的某些字段的值比較多,並且很少使用時,採用水平分表和垂直分表來優化
-
讀寫分離:當一臺服務器不能滿足需求時,採用讀寫分離的方式進行集羣
-
緩 存:使用redis來進行緩存
-
一些常用的優化技巧
1.10-查找並定位慢查詢
在項目自驗項目轉測試之前,在啓動mysql數據庫時開啓慢查詢,並且把執行慢的語句寫到日誌中,在運行一定的時間後,通過查看日誌找到慢查詢語句
使用explain慢查詢語句,來詳細分析語句的問題
1.11-數據庫分表
數據庫分表有水平(按行)分表和垂直(按列)分表
Mysql數據表一般達到百萬級別,查詢效率會非常低,容易造成表鎖,甚至堆積很多連接,直接掛掉,水平分表能夠很大程度減少這些壓力
1.12-Mysql事務的隔離級別
1.13-什麼是髒讀?什麼是幻讀?
- 髒讀:髒讀是指當一個事務正在訪問數據,並且對數據進行了修改。而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問了這個數據,然後使用了這個數據。
- 幻讀:幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到了表中的全部數據行。同時,第二個事務也修改了這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好像發生了幻覺一樣。
- 不可重複讀:一個事務多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A每次讀取同一數據時,結果不一致。
1.14-選擇合適的數據庫存儲引擎
開發中,我們經常使用的是MyISAM/innodb/memory
MyISAM引擎:
如果表對事務的要求不高,同時是以查詢和添加爲主的,我們考慮使用MyISAM存儲引擎
innodb引擎:
對事務要求高,保存的數據都是重要的數據,我們建議使用INNODB
memory引擎:
我們數據變化頻繁,不需要入庫,同時又頻繁的查詢和修改,我們考慮使用memory,速度極快
1.15-MyISAM和innodb的區別
-
事務安全:MyISAM不支持事務,INNODB支持事務
-
查詢和添加速度:MyISAM不支持事務,所以不用考慮同步鎖,所以查詢和刪除快,INNODB支持,所以速度比較慢
-
支持全文索引:MyISAM支持,INNODB不支持
-
鎖機制:MyISAM支持表鎖,而INNODB支持行鎖(事務)
-
外鍵MyISAM不支持外鍵,innodb支持外鍵(通常不設置外鍵,通常是在程序中 保證數據的一致)