數(shù)據(jù)庫
基礎(chǔ)知識
視圖是由SELECT語句組成的查詢定義的虛擬表卦绣, 代表的是一條select語句產(chǎn)生的結(jié)果集滤港。 它主要出于兩種原因:安全原因趴拧, 視圖可以隱藏一些數(shù)據(jù)山叮, 另一原因是可使復(fù)雜的查詢易于理解和使用屁倔。
數(shù)據(jù)庫的三級模式
- 模式
又稱概念模式汰现, 是由數(shù)據(jù)庫設(shè)計者綜合所有用戶的數(shù)據(jù)叔壤,按照統(tǒng)一的觀點(diǎn)構(gòu)造的全局邏輯結(jié)構(gòu),是對數(shù)據(jù)庫中全部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的總體描述嗅战,是所有用戶的公共數(shù)據(jù)視圖(全局視圖)俺亮。
- 外模式
是某個或某幾個用戶所看到的數(shù)據(jù)庫的數(shù)據(jù)視圖脚曾,是與某一應(yīng)用有關(guān)的數(shù)據(jù)的邏輯表示。外模式是從模式導(dǎo)出的一個子集珊泳,包含模式中允許特定用戶使用的那部分?jǐn)?shù)據(jù)拷沸。
- 內(nèi)模式
是數(shù)據(jù)庫中全體數(shù)據(jù)的內(nèi)部表示或底層描述,是數(shù)據(jù)庫最低一級的邏輯描述秧了,它描述了數(shù)據(jù)在存儲介質(zhì)上的存儲方式和物理結(jié)構(gòu)序无,對應(yīng)著實(shí)際存儲在外存儲介質(zhì)上的數(shù)據(jù)庫愉镰。
共享鎖又稱讀鎖,是讀取操作創(chuàng)建的鎖。其他用戶可以并發(fā)讀取數(shù)據(jù)拔莱,但任何事務(wù)都不能對數(shù)據(jù)進(jìn)行修改(獲取數(shù)據(jù)上的排他鎖)隘竭,直到已釋放所有共享鎖动看。
如果ORDER BY子句后未指定ASC或DESC爪幻,默認(rèn)使用ASC(升序)
主鍵、外鍵和索引的區(qū)別仇轻?
主鍵 外鍵
主鍵:數(shù)據(jù)庫表中對儲存數(shù)據(jù)對象予以唯一和完整標(biāo)識的數(shù)據(jù)列或?qū)傩缘慕M合奶甘。一個表只能有一個主鍵,且主鍵的取值不能缺失疲陕,即不能為空值(Null)钉赁。
外鍵:在一個表中存在的另一個表的主鍵稱此表的外鍵你踩。
索引結(jié)構(gòu)
索引一般有兩種結(jié)構(gòu):哈希索引和BTree索引
哈希索引會產(chǎn)生一張索引表,把數(shù)據(jù)通過算法換算成哈希值按厘,索引表存儲這些哈希值钱慢,并在表中保存指向數(shù)據(jù)的指針,值得注意的是索引表存儲哈希值時打亂了原有的存儲順序懒棉。哈希索引查找一條數(shù)據(jù)時特別快速策严,優(yōu)于BTree索引饿敲,但因?yàn)榇騺y了原有的數(shù)據(jù)順序,不支持范圍查找與排序功能倔韭。
B+Tree所有索引數(shù)據(jù)都在葉子節(jié)點(diǎn)上,并且增加了順序訪問指針胰苏,每個葉子節(jié)點(diǎn)都有指向相鄰葉子節(jié)點(diǎn)的指針醇疼。BTree索引查找單條數(shù)據(jù)的速度不如哈希索引,但是更加適用于范圍查找與排序倔毙,所以用的最為廣泛普监,引擎innodb與MyIsam都使用了BTree索引琉兜。
為什么用BTree做索引結(jié)構(gòu)
哈希:雖然單詞查詢快,但是沒有順序廊散,不適合范圍查詢
二叉樹:樹的高度不均勻梧疲,不能自平衡,查找效率與樹的高度有關(guān)缭受,IO代價高
紅黑樹:樹的高度隨數(shù)據(jù)量而變米者,IO代價高(數(shù)據(jù)量過大時宇智,樹的深度越高,IO讀寫越頻繁)
Btree:數(shù)據(jù)很大時喂分,不可能放在內(nèi)存机蔗,所以放在磁盤上甘萧,BTree 每層節(jié)點(diǎn)數(shù)多幔嗦,層數(shù)少沥潭,減少了IO讀寫次數(shù)钝鸽,查詢結(jié)果更加穩(wěn)定
一庞钢、事務(wù)
是作為單個邏輯單元執(zhí)行的一系列操作
原子性:要么全部成功,要么全部失敗回滾
一致性:一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)
隔離性:事務(wù)不能被其他事務(wù)的操作所干擾颜懊,多個并發(fā)事務(wù)之間要相互隔離
3.1 隔離級別
3.1.1 臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù)风皿,然后B回滾操作桐款,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
3.1.2 不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過程中媳维,對數(shù)據(jù)作了更新并提交遏暴,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時,結(jié)果 不一致州丹。
3.1.3 幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分?jǐn)?shù)改為ABCDE等級侥啤,但是系統(tǒng)管理員B就在這個時候插入了一條具體分?jǐn)?shù)的記錄盖灸,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣醉箕,這就叫幻讀。
小結(jié):不可重復(fù)讀的和幻讀很容易混淆讥裤,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除间螟。解決不可重復(fù)讀的問題只需鎖住滿足條件的行厢破,解決幻讀需要鎖表
- 持久性:一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的
二摩泪、范式
范式是符合某一種級別的關(guān)系模式的集合
第一范式:原子性
字段不可再分
第二范式:唯一性
有主鍵见坑,非主鍵字段依賴主鍵捏检;一個表只說明一個事物;
第三范式:無傳遞依賴
每列都與主鍵有直接關(guān)系戴尸,不存在傳遞依賴冤狡。
三、MYSQL優(yōu)化方法
a. 怎么發(fā)現(xiàn)有問題的SQL?(通過MySQL慢查詢?nèi)罩緦τ行蕟栴}的SQL進(jìn)行監(jiān)控)
通過MySQL的慢查詢?nèi)罩究媛停覀兛梢圆樵兂鰣?zhí)行的次數(shù)多占用的時間長的SQL
b. 通過explain關(guān)鍵字查詢和分析SQL的執(zhí)行計劃
c. SQL優(yōu)化
(語句優(yōu)化)
優(yōu)化嵌套查詢:子查詢可以被更有效率的連接(Join)替代坦胶;
優(yōu)化insert語句:一次插入多值晴楔;
當(dāng)只用一行數(shù)據(jù)時,select 1
拆分大查詢纪岁,有些操作會鎖表则果。把操作分割,避免表被鎖定太長時間遗增。
(索引優(yōu)化)
- 建立索引(索引用于查詢操作多、表大的情況霍狰,會增加插入刪除修改以及空間的開銷)
表結(jié)構(gòu)的水平垂直拆分優(yōu)化)
四缓待、Mysql引擎
數(shù)據(jù)庫引擎是用于存儲、處理和保護(hù)數(shù)據(jù)的核心服務(wù)。
MySQL存儲引擎主要有:InnoDB瘫镇、MyIsam答姥。
InnoDB是一個事務(wù)型的存儲引擎,有行級鎖定和外鍵約束尚粘, 實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的四種隔離級別敲长。
適用場景:經(jīng)常更新的表,適合處理多重并發(fā)的更新請求泽铛。支持事務(wù)辑鲤。
MyIsam
MyIASM是MySQL默認(rèn)的引擎,但是它沒有提供對數(shù)據(jù)庫事務(wù)的支持弛随,也不支持行級鎖和外鍵宁赤,因此當(dāng)INSERT或UPDATE數(shù)據(jù)時即寫操作需要鎖定整個表礁击。
Redis 支持的數(shù)據(jù)結(jié)構(gòu)豐富逗载,包括hash厉斟、set强衡、list等。
MongoDB 數(shù)據(jù)結(jié)構(gòu)比較單一感挥,但是支持豐富的數(shù)據(jù)表達(dá)
Redis是單線程的越败,但是為什么這么高效呢?
雖然Redis文件事件處理器以單線程方式運(yùn)行,但是通過使用I/O多路復(fù)用程序來監(jiān)聽多個套接字置谦,文件事件處理器既實(shí)現(xiàn)了高性能的網(wǎng)絡(luò)通信模型亿傅,又可以很好地與Redis服務(wù)器中其他同樣以單線程運(yùn)行的模塊進(jìn)行對接,這保持了Redis內(nèi)部單線程設(shè)計的簡單性谅阿。
五酬滤、約束
用于限制加入表的數(shù)據(jù)的類型, 是在表中定義的用于維護(hù)數(shù)據(jù)庫完整性的一些規(guī)則
1敏晤、not null(不能為空)
2、unique(此字段的每條記錄必須唯一男摧,一般我們用來約束id译打,他和primary key一樣,都對字段保證了唯一性)
3乔询、primary key(設(shè)置此字段為這張表的主鍵韵洋,每個表應(yīng)該有一個主鍵黄锤,而且每個表都只能有一個主鍵鸵熟,主鍵字段必須唯一且不能有null值)
4、foreign key(設(shè)置此字段為這張表的外鍵流强,它指向另一張表的主鍵打月。)
5蚕捉、check(約束用于限制字段中的值的范圍)
6、default(默認(rèn)值报破,如果定義了默認(rèn)值,再插入數(shù)據(jù)時如果沒有插入數(shù)據(jù),會根據(jù)默認(rèn)值插入)