2015暑假複習——數據庫

1、數據庫不滿足隔離性,會發生髒數據、不可重複讀、幻讀等情況。

髒數據:事務A在修改過程中發生了回滾,事務B讀到了修改之後的數據,這個數據是無效的;

不可重複讀:事務A修改數據的過程中,事務B讀取了一批數據;A修改之後B再去讀,發現結果跟之前的不一致;

幻讀:事務A在添加過程中發生了回滾,事務B讀到了添加之後的數據,是數據庫中不存在的。

2、遊標

遊標(cursor)是得到一組數據結果之後用來單行訪問數據集的指針。

3、java讀取數據庫的getObject和getString方法

getObject是一次性獲取所有數據,getString是一次一行。針對內存和網絡情況選擇相應的方法。

4、範式

範式是設計數據庫表結構時建議滿足的一些要求。從低到高依次有第一範式,第二範式,第三範式,BCNF範式,第四範式。大概瞭解了前三個。

第一範式是說表的每一列都不可再分,例如電話號碼,可以有固定電話和移動電話,這個設計就是不符合第一範式的。數據庫使用的時候都能夠滿足第一範式,設計不出不符合第一範式的表。

第二範式是說表中需要有主鍵,可以是單獨主鍵,也可以是組合主鍵,如果是組合主鍵,不能有部分依賴,例如一個成績表,主鍵是學號和課程號,有一個字段是學生年齡,這個字段部分依賴與學號,因此這個設計不符合第二範式。不符合第二範式會造成數據庫的數據冗餘。

第三範式是說表中不能夠有傳遞依賴與主鍵。例如主鍵學號決定了一個班級,班級決定了任課教師,任課教師就是傳遞依賴與學號的,這樣在修改的時候就需要很多冗餘操作。

後面幾個範式有待於進一步學習。。。。。。

5、索引

索引是提高數據庫查詢的一種有效方法,當然提高查詢的代價是需要維護一個索引表結構,數據庫在做增刪改操作的時候,索引表結構也要相應的修改,所以索引不是越多越好。

常見的索引有B+樹索引,hash索引,顧名思義,索引結構分別爲B+樹和hash表。B+樹比較好理解,指針域、葉子節點存放數據;hash表可以在常數時間查詢某一個數據(理想情況下,沒有衝突),但是hash表的問題就在於不能夠用於查詢連續數據集,而B+樹很擅長於此;hash不能做局部查詢,如like ‘%sql%’,因爲hash映射之後的結果不再是類似的內容;hash不能做排序;如果是組合的hash索引,必須在一起查詢;(關於hash索引和B+樹索引未完待續

組合索引的話,有一個名詞叫做最左前綴,意思是以左側的字段爲索引基準,在此基礎上再構造子域的索引。以最左前綴查詢時能夠提高索引效率,而以右側字段查詢時,是不會走索引的。所以最左前綴要選擇查詢頻率較高的、字段內容較豐富的、修改較少的,這通常會存在矛盾,所以需要平衡幾個條件,選擇最優最左前綴。

如果索引列允許爲null,則如果where查詢中存在is null的話,執行計劃會走全表查詢,因爲null是不定狀態,null和null也是不等的,所以要儘量避免在索引列上允許爲null;

聚集索引——物理結構與索引結構一致,通常索引子節點上直接存儲數據;非聚集索引——不一致。主鍵、經常批量查詢、不經常修改的字段通常設置成聚集索引。

6、幾種數據庫的比較

oracle是最古老的一種數據庫,傳統行業如金融等都用的這個,安全性比較高,性能也好;Mysql是2000年左右纔開始出現的,開源,比較適合輕量級網站開發,剛開始默認引擎是MyISAM,不支持事務,後來改成InnoDB,纔開始支持事務,Mysql對一些不常用的sql語句也不支持,例如check,會編譯,但不會在運行時檢查;sqlserver是微軟搞得,封閉,跟windows,vs兼容較好,一些中小企業常用。

mysql兩種存儲引擎的區別,MyISAM默認不支持事務,InnoDB支持事務;MyISAM需要較少的內存和磁盤空間,InnoDB因爲要支持事務所以需求較大;

7、優化查詢的幾種方法

1)用臨時表,把查詢結果緩存在數據庫中;

2)使用相同的sql語句,因爲之前已經在數據庫中編譯過了;

3)使用索引;

4)儘量不用like '%sql%'的形式,這樣的模糊查詢會不走索引;

5)用where語句儘可能的篩除數據,然後再執行聚集函數(groupby,having);

6)只查詢需要的字段;

7)如果知道查詢的條數,用limit限制;

8)對於鏈表查詢join,儘可能在兩個join的字段上加索引,這樣兩個字段就是有序的,不需要做笛卡爾積;

8、執行計劃的執行順序

where>group by>having>order by




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章