數據庫的基本是概念名詞解釋:
元組:可以理解為表的每一行就是一個元組
候選碼:若關系中的某一屬性組的值能夠唯一標識一個元組射窒,而其子集不能机久,則稱該屬性組為候選碼
主碼:若一個關系中有多個候選碼,選擇其中一個作為主碼;候選碼中各種屬性稱為主屬性乘盖,不包含在任何候選碼中的屬性稱為非主屬性 或 非碼屬性
主鍵:若某一個屬性組(注意是組)能唯一標識一條記錄呐赡,該屬性組就是一個主鍵娃豹。主鍵不能重復猜惋,且只能有一個,也不允許為空培愁。定義主鍵主要是為了維護關系數據庫的完整性著摔。
外鍵:? 外鍵用于與另一張表的關聯,是能確定另一張表記錄的字段定续。外鍵是另一個表的主鍵谍咆,可以重復,可以有多個私股,也可以是空值摹察。定義外鍵主要是為了保持數據的一致性。
1.事務四大特性(ACID)倡鲸,數據庫隔離級別供嚎,每個級別會引發(fā)什么問題,mysql默認是哪個級別?
參考:數據庫事務的四大特性以及事務的隔離級別 - fjdingsd - 博客園
事務:指邏輯上的一組操作峭状,組成這組操作的各個單元克滴,要不全部成功,要不全部不成功优床。?
四大特性:
(1)原子性(Atomicity):原子性是指一個操作是不可中斷的劝赔,事務包含的所有操作要么全部成功,要么全部失敗回滾
(2)一致性(Consistency):一致性是指事務必須使數據庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài)胆敞,也就是說一個事務執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)着帽。
(3)隔離性(Isolation):隔離性是當多個用戶并發(fā)訪問數據庫時,比如操作同一張表時移层,數據庫為每一個用戶開啟的事務仍翰,不能被其他事務的操作所干擾,多個并發(fā)事務之間要相互隔離观话。
? ? ? 數據庫隔離級別:
? ? ?? MySQL數據庫為我們提供的四種隔離級別:
① Serializable (串行化):可避免臟讀予借、不可重復讀、幻讀的發(fā)生匪燕。(最高級別蕾羊,級別越高執(zhí)行效率越低)
② Repeatable read (可重復讀):可避免臟讀喧笔、不可重復讀的發(fā)生帽驯。(? MySQL數據庫默認的級別 )
③ Read committed (讀已提交):可避免臟讀的發(fā)生。
④ Read uncommitted (讀未提交):最低級別书闸,任何情況都無法保證尼变。 ??
(注釋:a. 臟讀 : 指在一個事務處理過程里讀取了另一個未提交的事務中的數據
? ? ? ? ?? b. 不可重復讀 :不可重復讀是指在對于數據庫中的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值,這是由于在查詢間隔嫌术,被另一個事務修改并提交了哀澈。
? ? ? ? ? c.?虛讀(幻讀) : ?幻讀是事務非獨立執(zhí)行時發(fā)生的一種現象。例如事務T1對一個表中所有的行的某個數據項做了從“1”修改為“2”的操作度气,這時事務T2又對這個表中插入了一行數據項割按,而這個數據項的數值還是為“1”并且提交給數據庫。而操作事務T1的用戶如果再查看剛剛修改的數據磷籍,會發(fā)現還有一行沒有修改适荣,其實這行是從事務T2中添加的,就好像產生幻覺一樣院领,這就是發(fā)生了幻讀弛矛。簡單來說,幻讀是由插入或者刪除數據引起的)
.一般解決幻讀的方法是增加范圍鎖RangeS比然,鎖定檢鎖范圍為只讀丈氓,這樣就避免了幻讀
(4)持久性(Durability):持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的强法,即便是在數據庫系統(tǒng)遇到故障的情況下也不會丟失提交事務的操作万俗。
? 2.MYSQL的兩種存儲引擎區(qū)別(事務、鎖級別等等)饮怯,各自的適用場景? ?
Mysql在V5.1之前默認存儲引擎是MyISAM该编;在此之后默認存儲引擎是InnoDB
MyISAM:(MyISAM表不太適合于有大量更新操作和查詢操作應用,因為硕淑,大量的更新操作會造成查詢操作很難獲得讀鎖课竣,從而可能永遠阻塞。這種情況有時可能會變得非常糟糕V孟薄)
(1)不支持事務于樟,但是每次查詢都是原子的;
(2)支持表級鎖拇囊,即每次操作是對整個表加鎖迂曲;
(3)存儲表的總行數;
(4)一個MYISAM表有三個文件:索引文件寥袭、表結構文件路捧、數據文件;
(5)采用非聚集索引传黄,索引文件的數據域存儲指向數據文件的指針杰扫。輔索引與主索引基本一致,但是輔索引不用保證唯一性膘掰。
InnoDb:(提供了具有提交章姓、回滾和崩潰恢復能力的事務安全,但是寫的處理效率差一些并且會占用更多的磁盤空間以保留數據和索引。)
InnoDB中主鍵索引 使用的是 B+Tree凡伊,而?非主鍵索引(輔助索引)使用的是 B-Tree 數據結構
(1)支持ACID的事務:支持事務的四種隔離級別零渐;
(2)支持行級鎖及外鍵約束:因此可以支持寫并發(fā);
(3)不存儲總行數系忙;
(4)一個InnoDb引擎存儲在一個文件空間(共享表空間诵盼,表大小不受操作系統(tǒng)控制,一個表可能分布在多個文件里)银还,也有可能為多個(設置為獨立表空拦耐,表大小受操作系統(tǒng)文件大小限制,一般為2G)见剩,受操作系統(tǒng)文件大小的限制杀糯;
(5)主鍵索引采用聚集索引(索引的數據域存儲數據文件本身,按照每張表的主鍵構造一棵B+樹苍苞,樹中的葉子節(jié)點存放著表中的行記錄數據)固翰;輔索引也是一顆B+樹,只不過樹中的葉子節(jié)點存放著主鍵的值和一個書簽號羹呵,這個書簽用來告訴InnoDB引擎從哪里可以找到與索引相對應的行數據骂际;innodb表必須指定主鍵界轩,建議使用自增數字其爵,防止插入數據時风瘦,為維持B+樹結構欧募,文件的大調整。
MySQL的InnoDB索引原理詳解 - jimshi - 博客園
? 3.數據庫的優(yōu)化(從sql語句優(yōu)化和索引兩個部分回答) ??
MYSQL學習筆記——sql語句優(yōu)化之索引 - Tim-Tom - 博客園
一. SQL語句優(yōu)化
二.索引的優(yōu)化(建立索引的原則)
(1)表的主鍵餐弱、外鍵必須有索引;( 兩張表要想有著某種聯系囱晴,需要設定主鍵和外鍵兩個屬性膏蚓;外鍵特點:從表 外鍵的值是對主表? 鍵的引用,從表外鍵類型畸写,必須與主表主鍵類型一致 )
(2)數據量超過300的表應該有索引驮瞧;
(3)經常與其他表進行連接的表,在連接字段上應該建立索引艺糜;
(4)經常出現在Where子句中的字段剧董,特別是大表的字段,應該建立索引破停;
(5)盡量選擇區(qū)分度高的列作為索引翅楼,(例如像男,女這種區(qū)分度很少的字段不適合)區(qū)分度的公式是count(distinct col)/count(*)真慢,表示字段不重復的比例毅臊,比例越大我們掃描的記錄數越少
(6)索引應該建在小字段上,對于大的文本字段甚至超長字段黑界,不要建索引管嬉;例如,對一個CHAR(100)類型的字段進行全文檢索需要的時間肯定要比對CHAR(10)類型的字段需要的時間要多朗鸠。
(7)復合索引的建立需要進行仔細分析蚯撩;盡量考慮用單字段索引代替
(8)多列字段索引時,采用最左前綴匹配原則(? 所謂最左前綴原則就是在多列字段做索引時候(例如:state烛占,city胎挎,zipCode),想要索引生效的話先要看第一列state忆家,在第一列滿足的條件下再看左邊第二列city犹菇,以此類推。其他方式(如city芽卿,city/ipCode)揭芍,則索引不會生效 )
索引的理解
4.索引有B+索引和hash索引,各自的區(qū)別 ?
?(1)如果是等值查詢卸例,那么哈希索引明顯有絕對優(yōu)勢称杨,因為只需要經過一次算法即可找到相應的鍵值;當然了筷转,這個前提是列另,鍵值都是唯一的。如果鍵值不是唯一的旦装,就需要先找到該鍵所在位置页衙,然后再根據鏈表往后掃描,直到找到相應的數據阴绢;?
(2)如果是范圍查詢檢索店乐,這時候哈希索引就毫無用武之地了,因為原先是有序的鍵值呻袭,經過哈希算法后眨八,有可能變成不連續(xù)的了,就沒辦法再利用索引完成范圍查詢檢索左电;
(3) 同理廉侧,哈希索引也沒辦法利用索引完成排序页响,以及l(fā)ike ‘xxx%’ 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是范圍查詢)段誊;?
(4)哈希索引也不支持多列聯合索引的最左匹配規(guī)則闰蚕;?
(5)B+樹索引的關鍵字檢索效率比較平均,不像B樹那樣波動幅度大连舍,在有大量重復鍵值情況下没陡,哈希索引的效率也是極低的,因為存在所謂的哈希碰撞問題索赏。
5.B+索引數據結構盼玄,和B樹的區(qū)別
參考:【經典數據結構】B樹與B+樹 - vincently - 博客園
(1)B 樹可以看作是對2-3查找樹的一種擴展
一個 m 階的B樹滿足以下條件:
1)每個結點至多擁有m棵子樹;
2)根結點至少擁有兩顆子樹(存在子樹的情況下)潜腻;
3)除了根結點以外埃儿,其余每個分支結點至少擁有 m/2 棵子樹;
4)所有的葉結點都在同一層上融涣;
5)有 k 棵子樹的分支結點則存在 k-1 個關鍵碼蝌箍,關鍵碼按照遞增次序進行排列;(還剩那一個碼位表示關鍵碼的個數n)
6)關鍵字數量n需要滿足【m/2】-1 <= n <= m-1暴心; ? ? ? ? 【m/2】表示不小于m/2的整數
(2)B+樹是對B樹的一種變形樹妓盲,以一個m階樹為例:
1)根結點只有一個,分支數量范圍為[2专普,m]悯衬;
2)分支結點,每個結點包含分支數范圍為【? [m/2] ,? m? 】檀夹;
3)分支結點的關鍵字數量等于其子分支的數量減一筋粗,關鍵字的數量范圍為【? [(m/2)-1] ,? m-1 】,關鍵字順序遞增炸渡;所有分支節(jié)點都可以看成是索引娜亿,節(jié)點中僅含有其子樹中最大或最小的關鍵字。
4)所有葉子結點都在同一層蚌堵;樹的所有葉結點構成一個有序鏈表买决,可以按照關鍵碼排序的次序遍歷全部記錄。
為什么要B+樹吼畏?
由于B+樹的數據都存儲在葉子結點中督赤,分支結點均為索引,方便掃庫泻蚊,只需要掃一遍葉子結點即可躲舌,但是B樹因為其分支結點同樣存儲著數據,我們要找到具體的數據性雄,需要進行一次中序遍歷按序來掃没卸,所以B+樹更加適合在區(qū)間查詢的情況羹奉,所以通常B+樹用于數據庫索引,而B樹則常用于文件索引约计。
B樹和B+樹的區(qū)別
這都是由于B+樹和B具有這不同的存儲結構所造成的區(qū)別诀拭,以一個m階樹為例。
(1)關鍵字的數量不同病蛉;B+樹中有 k 棵子樹的分支結點則存在 k個關鍵碼炫加,關鍵碼按照遞增次序進行排列瑰煎;其關鍵碼只是起到了一個索引的作用铺然,但是B樹有 k 棵子樹的分支結點則存在 k-1 個關鍵碼,關鍵碼按照遞增次序進行排列酒甸;
(2)存儲的位置不同魄健;B+樹中的數據都存儲在葉子結點上,也就是其所有葉子結點的數據組合起來就是完整的數據插勤,但是B樹的數據存儲在每一個結點中沽瘦,并不僅僅存儲在葉子結點上。
(3)分支結點的構造不同农尖;B+樹的分支結點僅僅存儲著關鍵字信息和兒子的指針(這里的指針指的是磁盤塊的偏移量)析恋,也就是說內部結點僅僅包含著索引信息。
(4)查詢不同盛卡;B樹在找到具體的數值以后助隧,則結束,而B+樹則需要通過索引找到葉子結點中的數據才結束滑沧,也就是說B+樹的搜索過程中走了一條從根結點到葉子結點的路徑并村。
? 6.索引的分類(主鍵索引、唯一索引)滓技,最左前綴原則哩牍,哪些情況索引會失效 ?
索引只要創(chuàng)建了,就會自動調用令漂;order by即distinc或是like等膝昆,都不會使用索引。也就是說叠必,索引對于他們是無效的
MySQL目前主要有以下幾種索引類型:MySQL索引類型 - 成九 - 博客園
(1)聚集索引:指數據行中數據的物理順序與索引的邏輯順序相同外潜。一個表只能有一個聚集索引,因為一個表的物理順序只有一種情況挠唆,所以处窥,對應的聚集索引只能有一個?
(2)非聚集索引:該索引中索引的邏輯順序與磁盤上行的物理存儲順序不同,一個表中可以擁有多個非聚集索引玄组。(非聚集索引包括 普通索引滔驾,唯一索引谒麦,全文索引)
? ? ? ? ? 1)普通索引:這是最基本的索引,它沒有任何限制哆致,
? ? ? ? ? 2)唯一索引:索引的每一個索引值只對應唯一的數據記錄绕德;索引列的值必須唯一,但允許有空值(注意和主鍵不同)( create unique index stusno on Student(Sno) ,建立唯一索引stusno)
? ? ? ? ? 3)全文索引:主要用來查找文本中的關鍵字摊阀,而不是直接與索引中的值相比較耻蛇。fulltext索引跟其它索引大不相同,它更像是一個搜索引擎胞此,而不是簡單的where語句的參數匹配臣咖。fulltext索引配合match against操作使用,而不是一般的where語句加like漱牵。
(3)組合索引(最左前綴):指多個字段上創(chuàng)建的索引夺蛇,只有在查詢條件中使用了創(chuàng)建索引時的第一個字段,索引才會被使用酣胀。使用組合索引時遵循最左前綴集合
所謂最左前綴原則就是在多列字段做索引時候(例如:state刁赦,city,zipCode)闻镶,想要索引生效的話先要看第一列state甚脉,在第一列滿足的條件下再看左邊第二列city,以此類推铆农。其他方式(如city牺氨,city/ipCode),則索引不會生效?
(4)B+樹索引:將索引屬性組織成B+樹的形式
(5)哈希索引:建立若干個桶顿涣,將索引屬性按照其散列函數值映射到相應的桶中去波闹,桶中存放索引屬性值和相應的元組指針,查找速度很快涛碑。
? 7.聚集索引和非聚集索引區(qū)別
兩者的根本區(qū)別是 ? 表記錄的排列順序? 與? 索引的排列順序? 是否一致精堕。
(1)聚集(clustered)索引:表記錄的排列順序和索引的排列順序一致,一個表中只能擁有一個聚集索引蒲障。
聚集索引就像是字典的拼音目錄歹篓,對應的A-Z的字順序 和 字典實際存儲的字的順序A-Z也是一樣的,
而? 非聚集(unclustered)索引: 表記錄的排列順序和索引的排列順序不一致揉阎,一個表中可以擁有多個非聚集索引庄撮。 ?? 非聚集索引就像新華字典的偏旁字典,它的結構順序與實際存放順序不一定一致毙籽。
? ? ? ? ? ? ? ? ? ??
(3)聚集索引存儲記錄是物理上連續(xù)存在洞斯,而非聚集索引是邏輯上的連續(xù),物理存儲并不連續(xù)坑赡。
(4)聚集索引查詢數據速度快烙如,插入數據速度慢么抗;非聚集索引反之。
? 8.有哪些鎖(樂觀鎖悲觀鎖)亚铁,select時怎么加排它鎖? ?
? ? ? 樂觀鎖和悲觀鎖蝇刀。樂觀鎖即樂觀并發(fā)控制,悲觀鎖即悲觀并發(fā)控制徘溢,他們是處理并發(fā)控制時主要采用的技術手段吞琐。其中,悲觀鎖正是數據庫本身提供的鎖機制實現的然爆。
(1) 悲觀鎖(Pessimistic Concurrency Control)縮寫為PCC--------就是每次當前事務去讀取數據的時候都認為別的事務可能會對數據進行修改站粟,所以每次在讀取數據的時候都會上鎖,這樣別的事務想拿這個數據就會進入阻塞狀態(tài)施蜜,直到它拿到鎖卒蘸。在傳統(tǒng)的關系型數據庫里邊就用到了很多這種鎖機制雌隅,比如行鎖翻默,表鎖等,讀鎖恰起,寫鎖等修械,都是在做操作之前先上鎖。這對于長事務來講检盼,可能會嚴重影響系統(tǒng)的并發(fā)處理能力
(2) 樂觀鎖(Optimistic?Concurrency Control)縮寫為OCC肯污,從字面意義上理解,每次當前事務去讀取數據的時候都認為別的事務不會對數據進行修改吨枉,所以不會上鎖蹦渣,只在數據進行提交更新的時候,才會正式對數據是否被改變進行檢測貌亭,如果發(fā)現被改變了柬唯,則宣告失敗進行回滾,否則就更新數據圃庭。相對于悲觀鎖锄奢,樂觀鎖在處理數據庫時,不會使用數據庫提供的鎖機制剧腻,一般事項樂觀鎖的的方式就是記錄數據版本拘央。這就要求避免使用長事務和鎖機制,以免導致系統(tǒng)并發(fā)處理能力降低书在,保障系統(tǒng)生產效率灰伟。
select如何加排它鎖:
用法: select … for update;
例如:select * from goods where id = 1 for update;
? 9.關系型數據庫和非關系型數據庫區(qū)別? ?
(1)關系型數據庫通過外鍵關聯來建立表與表之間的關系,
(2)非關系型數據庫通常指數據以對象的形式存儲在數據庫中儒旬,而對象之間的關系通過每個對象自身的屬性來決定
(3)非關系型數據庫中栏账,我們查詢一條數據遏乔,結果出來一個數組,關系型數據庫中发笔,查詢一條數據結果是一個對象盟萨。
? 10.了解nosql? ?
指的是非關系型的數據庫,是對不同于傳統(tǒng)的關系型數據庫的數據庫管理系統(tǒng)的統(tǒng)稱了讨。NoSQL用于超大規(guī)模數據的存儲捻激。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式前计,無需多余操作就可以橫向擴展胞谭。
(1)鍵值(Key-Value)存儲數據庫,這一類數據庫主要會使用到一個哈希表男杈,這個表中有一個特定的鍵和一個指針指向特定的數據
(2)列存儲數據庫丈屹,這部分數據庫通常是用來應對分布式存儲的海量數據
(3)文檔型數據庫,該類型的數據模型是版本化的文檔伶棒,半結構化的文檔以特定的格式存儲
(4)圖形(Graph)數據庫旺垒,它是使用靈活的圖形模型,并且能夠擴展到多個服務器上
總結NoSQL數據庫在以下的這幾種情況下比較適用:1肤无、數據模型比較簡單先蒋;2、需要靈活性更強的IT系統(tǒng)宛渐;3竞漾、對數據庫性能要求較高;4窥翩、不需要高度的數據一致性业岁;5、對于給定key寇蚊,比較容易映射復雜值的環(huán)境笔时。
? 11.數據庫三范式
(1)第一范式(1NF):確保每一列的原子性,如果每一列都是不可再分的最小數據單元幔荒,則滿足第一范式糊闽。
(2)第二范式(2NF):在1NF基礎上,另外包含兩部分內容爹梁,一是表必須有一個主鍵右犹;二是沒有包含在主鍵中的列必須完全依賴于主鍵,而不能只依賴于主鍵的一部分姚垃。
(3)第三范式(3NF):在2NF基礎上念链,非主鍵列必須直接依賴于主鍵衬浑,不能存在傳遞依賴硅确。即不能存在:非主鍵列 A 依賴于非主鍵列 B跌帐,非主鍵列 B 依賴于主鍵的情況打掘。(在2NF基礎上消除傳遞依賴)
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,區(qū)分它們的關鍵點在于君编,2NF:非主鍵列是否完全依賴于主鍵跨嘉,還是依賴于主鍵的一部分;3NF:非主鍵列是直接依賴于主鍵吃嘿,還是直接依賴于非主鍵列祠乃。
(4)BCNF?巴斯-科德范式 :任何非主屬性不能對主鍵子集依賴(在3NF基礎上消除對主碼子集的依賴)
巴斯-科德范式(BCNF)是第三范式(3NF)的一個子集,即滿足巴斯-科德范式(BCNF)必須滿足第三范式(3NF)
? 12.數據庫的主從復制? ?
簡單的總結就是:主服務器將數據變動寫入到一個二進制日志中去降瞳,從服務器通過I/O線程讀取主服務器的二進制日志寫入到從服務器的中繼日志中嘱支,再讀取中繼日志中的數據放入自己的數據庫中。
? 13.使用explain優(yōu)化sql和索引 ?
Explain命令在解決數據庫性能上是第一推薦使用命令挣饥,大部分的性能問題可以通過此命令來簡單的解決除师,Explain可以用來查看SQL語句的執(zhí)行效 果,可以幫助選擇更好的索引和優(yōu)化查詢語句亮靴,寫出更好的優(yōu)化語句馍盟。?使用 explain 關鍵字可以模擬優(yōu)化器執(zhí)行 sql 查詢語句于置,從而得知 MySQL 是如何處理 sql 語句茧吊。
使用方法: ? explain + 待執(zhí)行的sql
14.設置long_query_time的值無效的原因及解決方法
? 15.(連接查詢)------- 內連接、外連接八毯、交叉連接搓侄、笛卡兒積等?
(1)? 內連接(INNER JOIN): ? join默認的連接
??? 分為三種:
? ? 等值連接 : ? 在連接條件中使用等于號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列话速,包括其中的重復列讶踪。
?? 非等值連接 : ?在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括? >泊交、>=乳讥、<=、<廓俭、!>云石、!<和<>。
?? 自然連接 :?在連接條件中使用等于(=)運算符比較被連接列的列值研乒,但它使用選擇列表指出查詢結果集合中所包括的列汹忠,并刪除連接表中的重復列。
(2)? 外連接(OUTER JOIN):
? ?? 分為三種:??
? ?? 左外連接(LEFT OUTER JOIN或LEFT JOIN)? :左向外聯接的結果集包括 ?LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行宽菜。如果左表的某行在右表中沒有匹配行谣膳,則在相關聯的結果集行中右表的所有選擇列表列均為空值。 ??
? ?? 右外連接(RIGHT OUTER JOIN或RIGHT JOIN)? :右向外聯接是左向外聯接的反向聯接铅乡。將返回右表的所有行继谚。如果右表的某行在左表中沒有匹配行,則將為左表返回空值阵幸。?
? ?? 全外連接(FULL OUTER JOIN或FULL JOIN) :返回左表和右表中的所有行犬庇。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值侨嘀。如果表之間有匹配行臭挽,則整個結果集行包含基表的數據值。
(3) ? 交叉連接(CROSS JOIN):??交叉聯接返回左表中的所有行咬腕,左表中的每一行與右表中的所有行組合欢峰。交叉聯接也稱作笛卡爾積。 沒有WHERE 子句涨共,它返回連接表中所有數據行的笛卡爾積
? 16.MVCC機制? ?
MVCC是一種多版本并發(fā)控制機制,MVCC可以在大多數情況下代替行級鎖,使用MVCC,能降低其系統(tǒng)開銷.?在MVCC協(xié)議下举反,每個讀操作會看到一個一致性的snapshot懊直,并且可以實現非阻塞的讀(讀取時非阻塞是目的,因為一般情況下為了保證數據在并行讀取時候的一致性火鼻,讀操作會被寫操作阻塞室囊,影響效率)。
實現:InnoDB的MVCC,是通過在每行記錄后面保存兩個隱藏的列來實現的,這兩個列魁索,分別保存了這個行的創(chuàng)建時間融撞,一個保存的是行的刪除時間。這里存儲的并不是實際的時間值,而是系統(tǒng)版本號(可以理解為事務的ID)粗蔚,每開始一個新的事務尝偎,系統(tǒng)版本號就會自動遞增,事務開始時刻的系統(tǒng)版本號會作為事務的ID.
17.根據具體場景鹏控,說明版本控制機制 ? ? 數據庫開發(fā)中的版本控制_風過無痕_新浪博客?
為什么要把數據庫版本控制起來致扯?
一、最重要的就是当辐,多人可以隨便修改執(zhí)行存儲過程或者函數抖僵。(當前需要輔助以安全控制機制)
二、數據庫版本化演進瀑构,如果已經上線的數據庫裆针,版本化就很重要刨摩,講應用程序和數據庫置于同一個版本控制之下,這樣可以在開發(fā)中很容易追溯到已經發(fā)布的程序中出現的問題世吨。
三澡刹、容易追蹤人員對數據庫的相關更改。
? 18.死鎖產生的必要條件耘婚,死鎖怎么解決
(1)互斥條件:某資源只能被一個進程使用罢浇,其他進程請求該資源時,只能等待沐祷,知道資源使用完畢后釋放資源嚷闭。
(2)占有并等待條件:程序已經保持了至少一個資源,但是又在等待另外一個資源赖临,而這個資源被其他進程占用胞锰,自己占用資源卻保持不放。
(3)不可搶占條件:進程已獲得的資源沒有使用完兢榨,不能被搶占嗅榕。
(4)循環(huán)等待條件:存在了一個循環(huán)鏈。
? 解決死鎖只需要破壞四個條件中的一個就行了
?19. varchar和char的使用場景
Varchar:往往用來保存可變長度的字符串吵聪。簡單的說凌那,我們只是給其固定了一個最大值,然后系統(tǒng)會根據實際存儲的數據量來分配合適的存儲空間(VARCHAR數據類型會多用1個字節(jié)用來存儲長度信息)
CHAR:采用的是固定長度的存儲方式吟逝。簡單的說帽蝶,就是系統(tǒng)總為其分配最大的存儲空間。當數據保存時块攒,即使 其沒有達到最大的長度励稳,系統(tǒng)也會為其分配這么多的存儲空間。
應用場景:char 固定長度局蚀,所以在處理速度上要比varchar快速很多麦锯,但是對費存儲空間,所以對存儲不大琅绅,但在速度上有要求的可以使用char類型,反之可以用varchar類型來實例鹅巍。
? 20.mysql并發(fā)情況下怎么解決
?? 通過事務千扶、隔離級別、鎖
? 21.Redis
Redis 總結精講 看一篇成高手系統(tǒng)-4 - CSDN博客
為什么redis這么快骆捧?
(一)純內存操作
(二)單線程操作澎羞,避免了頻繁的上下文切換
(三)采用了非阻塞I/O多路復用機制
(1)redis數據結構有哪些 ??
?? 1)String:? 可以是字符串,整數或者浮點數敛苇,對整個字符串或者字符串中的一部分執(zhí)行操作妆绞,對整個整數或者浮點執(zhí)行自增(increment)或者自減(decrement)操作顺呕。
?? 2)list :一個鏈表,鏈表上的每個節(jié)點都包含了一個字符串括饶,蟲鏈表的兩端推入或者彈出元素株茶,根據偏移量對鏈表進行修剪(trim),讀取單個或者多個元素图焰,根據值查找或者移除元素启盛。
? 3)set:包含字符串的無序收集器(unordered collection)、并且被包含的每個字符串都是獨一無二的技羔。添加僵闯,獲取,移除單個元素藤滥,檢查一個元素是否存在于集合中鳖粟,計算交集,并集拙绊,差集牺弹,從集合里面隨機獲取元素。
?4)hash:包含鍵值對無序散列表时呀,添加张漂,獲取,移除當鍵值對谨娜,獲取所有鍵值對航攒。
?5)zset:字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定趴梢。添加漠畜,獲取,刪除單個元素坞靶,根據分值范圍(range)或者成員來獲取元素憔狞。
? (2)redis隊列應用場景 ??
? ? ? 通過消息隊列,將短時間高并發(fā)產生的事務消息存儲在消息隊列中彰阴,從而削平高峰期的并發(fā)事務瘾敢,改善網站系統(tǒng)的性能。
? (3)redis和Memcached的區(qū)別(支持數據持久化) ?
1)尿这、Redis和Memcache都是將數據存放在內存中簇抵,都是內存數據庫。不過memcache還可用于緩存其他東西射众,例如圖片碟摆、視頻等等;
2)叨橱、Redis不僅僅支持簡單的k/v類型的數據典蜕,同時還提供list断盛,set,hash等數據結構的存儲愉舔;
3)钢猛、虛擬內存--Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤屑宠;
4)厢洞、過期策略--memcache在set時就指定,例如set key1 0 0 8,即永不過期典奉。Redis可以通過例如expire 設定躺翻,例如expire name 10;
5)卫玖、分布式--設定memcache集群公你,利用magent做一主多從;redis可以做一主多從。都可以一主一從假瞬;
6)陕靠、存儲數據安全--memcache掛掉后,數據沒了脱茉;redis可以定期保存到磁盤(持久化)剪芥;
7)、災難恢復--memcache掛掉后琴许,數據不可恢復; redis數據丟失后可以通過aof恢復税肪;
8)、Redis支持數據的備份榜田,即master-slave模式的數據備份益兄;
9)、應用場景不一樣:Redis出來作為NoSQL數據庫使用外箭券,還能用做消息隊列净捅、數據堆棧和數據緩存等;Memcached適合于緩存SQL語句辩块、數據集蛔六、用戶臨時性數據、延遲查詢數據和session等庆捺。
22. join和union區(qū)別
join: 是兩張表做交連后里面條件相同的部分記錄產生一個記錄集古今,
union:UNION 是將已經產生的兩個記錄集(字段要一樣的)并在一起,成為一個新的記錄集 滔以。
23. 查看SQL執(zhí)行計劃 ??SQL:執(zhí)行計劃的幾種方法 - CSDN博客
(1) set autotrace (需要執(zhí)行sql)
(2) explain plan for
24.?有十萬條數據, 寫SQL語句查詢其中某字段較大值的幾條數據(沒優(yōu)化的)
select * from table where date = (select date from table order by date desc limit 10 )
? ? ? ? ? ? ? ? 注釋: ASC(升序)?或?DESC(降序)
25.?子查詢與連接查詢(關聯查詢)的區(qū)別
? 子查詢是將一個查詢語句嵌套在另外一個查詢語句中,內層查詢語句的查詢結果坏匪,可以為外層查詢語句提供查詢條件拟逮。
(1)表連接都可以用子查詢,但不是所有子查詢都能用表連接替換适滓,
(2)子查詢比較靈活敦迄,方便,形式多樣凭迹,適合用于作為查詢的篩選條件罚屋,而表連接更適合與查看多表的數據;
(3)子查詢不一定需要有關聯字段嗅绸,而連接查詢必須有字段關聯(所謂的主外鍵關系)
(4)連接查詢的效率在大多數情況下要明顯優(yōu)于子查詢
26.索引的作用及索引的數據結構 ?
?索引的作用及索引的數據結構 - Burning_Leaf - 博客園
(1)mysql索引的用途:
保持數據的完整性脾猛;
優(yōu)化數據的訪問性能
改進表的鏈接(join)操作
對結果進行排序
簡化聚合數據操作
(2)索引的數據結構: ?? B樹、B+樹鱼鸠、哈希表(散列表)猛拴、R-
索引(Index)是幫助MySQL高效獲取數據的數據結構。提取句子主干蚀狰,就可以得到索引的本質:索引是一種數據結構愉昆。
1)B樹結構-------支持插入、控制操作以及通過管理一系列樹根狀結構的彼此聯通的節(jié)點中來做選擇麻蹋。B-樹結構中有兩種節(jié)點類型:索引節(jié)點和葉子節(jié)點跛溉。葉子節(jié)點是存儲數據的,而索引節(jié)點是用來告訴用戶存儲在葉子節(jié)點中的數據的順序哥蔚,并幫助用戶找到數據倒谷。B-樹不是二叉樹,二叉樹只是一種簡單的節(jié)點層次結構的實現糙箍。(B樹索引實現是一個專門為范圍查詢設計的渤愁,是用于磁盤級查找最流行的數據結構)
2)B+樹--------是B-樹結構的增強版,盡管B+樹支持B-樹的所有特性深夯,他們之間最顯著的不同點在于B+樹中底層數據是按照提及的索引列進行排序的抖格。B+樹還通過在葉子節(jié)點之間附加引用來優(yōu)化掃描的性能。 ?? (MyISAM索引實現咕晋,和InnoDB索引實現都是B+樹結構雹拄,但是實現方式完全不一樣:(1)第一個重大區(qū)別是InnoDB的數據文件本身就是索引文件,MyISAM索引文件和數據文件是分離的掌呜,索引文件僅保存數據記錄的地址滓玖。而在InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構质蕉,這棵樹的葉結點data域保存了完整的數據記錄势篡。這個索引的key是數據表的主鍵翩肌,因此InnoDB表數據文件本身就是主索引。(2)第二個與MyISAM索引的不同是InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址禁悠。換句話說念祭,InnoDB的所有輔助索引都引用主鍵作為data域。)
3)哈希表(散列表)--------哈希表數據結構是一個簡單的概念碍侦,他將一種算法應用到給定值中以在底層數據存儲系統(tǒng)中返回一個唯一的指針或位置粱坤。哈希表的優(yōu)點是始終以線性時間復雜度找到需要讀取的行的位置,而不想B-樹那樣需要跨越多層節(jié)點來確定位置瓷产。(散列實現對直接查找方式能提供最優(yōu)的性能站玄,但對一定范圍的查找卻效率底下)
4)通信R-樹------R-樹數據結構支持基于數據類型對集合數據進行管理。目前只有MyIsam使用R-樹支持空間索引拦英。使用空間索引也有很多限制蜒什,比如只支持唯一的NOT NULL 列等“坦溃空間索引并不常用灾常。
27. 數據庫高并發(fā)訪問方法
大數據量高并發(fā)的數據庫優(yōu)化詳解(MSSQL) - 洛晨隨風 - 博客園
28. 為什么要把數據庫版本控制起來?
一铃拇、最重要的就是钞瀑,多人可以隨便修改執(zhí)行存儲過程或者函數。(當前需要輔助以安全控制機制)
二慷荔、數據庫版本化演進雕什,如果已經上線的數據庫,版本化就很重要显晶,講應用程序和數據庫置于同一個版本控制之下贷岸,這樣可以在開發(fā)中很容易追溯到已經發(fā)布的程序中出現的問題。
三磷雇、容易追蹤人員對數據庫的相關更改偿警。
29. 常用數據庫語句
(1)創(chuàng)建數據庫:Create DATABASE database-name
(2)刪除數據庫: drop database dbname
(3)備份 sql server--- 創(chuàng)建 備份數據的 device USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 開始 備份 BACKUP DATABASE pubs TO testBack
(4)創(chuàng)建新表:create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
? 根據已有的表創(chuàng)建新表:
? ? ? ? ? ? ? A : create table tab_new like tab_old ( 使用舊表創(chuàng)建新表 )
? ? ? ? ? ? B : create table tab_new as select col1,col2 … from tab_old definition only
(5)刪除新表 drop table tabname
(6)增加一個列:Alter table tabname add column col type
? ? ? ? ? ? 注:列增加后將不能刪除。 DB2 中列加上后數據類型也不能改變唯笙,唯一能改變的是增加 ? ? varchar 類型的長度螟蒸。
(7)添加主鍵: Alter table tabname add primary key(col)
? ? ? ? 刪除主鍵: Alter table tabname drop primary key(col)
(8)創(chuàng)建索引: create [unique] index idxname on tabname(col … .)
? ? ? ?? 刪除索引: drop index idxname
? ? ? ?? 注:索引是不可更改的,想更改必須刪除重新建崩掘。
(9)創(chuàng)建視圖: create view viewname as select statement
? ? ? ?? 刪除視圖: drop view viewname
(10)幾個簡單的基本的 sql 語句
選擇: select * from table1 where 范圍
插入: insert into table1(field1,field2) values(value1,value2)
刪除: delete from table1 where 范圍
更新: update table1 set field1=value1 where 范圍
查找? : select * from table1 where field1 like ’ %value1% ’ ---like 的語法很精妙七嫌,查資料 !
排序: select * from table1 order by field1,field2 [desc]
總數: select count * as totalcount from table1
求和: select sum(field1) as sumvalue from table1
平均: select avg(field1) as avgvalue from table1
最大: select max(field1) as maxvalue from table1
最小: select min(field1) as minvalue from table1
30.?數據庫分庫分表思路
一. ? 數據切分------將數據分散存儲到多個數據庫中苞慢,使得單一數據庫中的數據量變小诵原,通過擴充主機的數量緩解單一數據庫的性能問題,從而達到提升數據庫操作性能的目的。
數據切分根據其切分類型皮假,可以分為兩種方式:垂直(縱向)切分和水平(橫向)切分
1.? 垂直切分----常見有? 垂直分庫? 和? 垂直分表 ? 兩種鞋拟。
? (1)垂直分庫----就是根據業(yè)務耦合性骂维,將關聯度低的不同表存儲在不同的數據庫惹资。做法與大系統(tǒng)拆分為多個小系統(tǒng)類似,按業(yè)務分類進行獨立劃分航闺。與"微服務治理"的做法相似褪测,每個微服務使用單獨的一個數據庫
垂直分表是基于數據庫中的"列"進行,某個表字段較多潦刃,可以新建一張擴展表侮措,將不經常用或字段長度較大的字段拆分出去到擴展表中
2、水平(橫向)切分
水平切分-------分為 ? 庫內分表? 和? 分庫分表乖杠,是根據表內數據內在的邏輯關系,將同一個表按不同的條件分散到多個數據庫或多個表中,每個表中只包含一部分數據暖哨,從而使得單個表的數據量變小滚婉,達到分布式的效果;
庫內分表只解決了單一表數據量過大的問題卫漫,但沒有將表分布到不同機器的庫上菲饼,因此對于減輕MySQL數據庫的壓力來說,幫助不是很大列赎,大家還是競爭同一個物理機的CPU宏悦、內存、網絡IO包吝,最好通過分庫分表來解決
31.delete,truncate,drop的區(qū)別
32.事務兩階段提交
33.?數據庫三級模式結構:外模式饼煞、內模式、模式 ? 及其兩級映像/映射
模式也稱為邏輯模式或概念模式砖瞧,是數據庫中全體數據的邏輯結構和特征的描述,是所有用戶的公共數據視圖(全局視圖)掺喻。一個數據庫只有一個模式芭届,模式位于三級結構的中間層。
模式又稱概念模式或邏輯模式感耙,對應于概念級褂乍。它是由數據庫設計者綜合所有用戶的數據,按照統(tǒng)一的觀點構造的全局邏輯結構即硼,是對數據庫中全部數據的邏輯結構和特征的總體描述逃片,是所有用戶的公共數據視圖(全局視圖)。它是由數據庫管理系統(tǒng)提供的數據模式描述語言(DDL)來描述、定義的褥实,體現呀狼、反映了數據庫系統(tǒng)的整體觀。
外模式也稱為用戶模式哥艇,它是數據庫用戶(包括應用程序員和最終用戶)能夠看見和使用的局部數據的邏輯結構和特征的描述,是數據庫用戶的數據視圖僻澎,是與某一應用有關的數據的邏輯表示貌踏。外模式是模式的子集,一個數據庫可以有多個外模式窟勃。
外模式又稱子模式祖乳,對應于用戶級。它是某個或某幾個用戶所看到的數據庫的數據視圖秉氧,是與某一應用有關的數據的邏輯表示眷昆。外模式是從模式導出的一個子集,包含模式中允許特定用戶使用的那部分數據汁咏。用戶可以通過外模式描述語言來描述亚斋、定義對應于用戶的數據記錄(外模式),也可以利用數據操縱語言(DML)對這些數據記錄進行梆暖。外模式反映了數據庫的用戶觀伞访。 (外模式保證了數據與程序的邏輯獨立性)
內模式也稱為存儲模式轰驳,一個數據庫只有一個內模式厚掷,它是數據物理結構和存儲方式的描述,是數據在數據庫內部的表示方式
內模式又稱存儲模式级解,對應于物理級冒黑,它是數據庫中全體數據的內部表示或底層描述,是數據庫最低一級的邏輯描述勤哗,它描述了數據在存儲介質上的存儲方式的物理結構抡爹,對應著實際存儲在外存儲介質上的數據庫。內模式由內模式描述語言來描述芒划、定義冬竟,它是數據庫的存儲觀。
三級模式之間的映射
數據庫管理系統(tǒng)在三級模式之間提供了兩層映射民逼,分別為外模式/模式映射泵殴、模式/內模式映射。
對于同一個模式可以有任意多個外模式笑诅。對于每一個外模式,數據庫系統(tǒng)都有一個外模式/模式映射。當模式被改變時吆你,數據庫管理員對各個外模式/模式映射做相應的改變弦叶,可以使外模式保持不變。這樣妇多,依據數據外模式編寫的應用程序就不用修改伤哺,保證了數據與程序的邏輯獨立性。
數據庫中只有一個模式和一個內模式默责,所以模式/內模式的映射是唯一的,它定義了數據庫的全局邏輯結構與存儲結構之間的對應關系咸包。當數據庫的存儲結構被改變時,數據庫管理員對模式/內模式映射做相應的改變杖虾,可以使模式保持不變烂瘫,應用程序相應地也不做變動。這樣奇适,保證了數據與程序的物理獨立性坟比。
34.數據庫鎖的類型(三種鎖)
鎖的類型有三種:?
共享(S)鎖:多個事務可封鎖一個共享頁;任何事務都不能修改該頁嚷往; 通常是該頁被讀取完畢葛账,S鎖立即被釋放。?
排它(X)鎖:僅允許一個事務封鎖此頁皮仁;其他任何事務必須等到X鎖被釋放才能對該頁進行訪問籍琳;X鎖一直到事務結束才能被釋放。
?更新(U)鎖:用來預定要對此頁施加X鎖贷祈,它允許其他事務讀趋急,但不允許再施加U鎖或X鎖;當被讀取的頁將要被更新時势誊,則升級為X鎖呜达;U鎖一直到事務結束時才能被釋放。