七贡羔、數(shù)據(jù)庫相關(guān)
1.MySQL InnoDB、Mysaim的特點(diǎn)碍讨?
innodb治力、mysiam
innodb:注重事務(wù)、行級鎖勃黍、R/W比較少,頻繁更新大字段
mysiam : 注重性能晕讲、表級鎖覆获、R/W > 100 :1且update相對較少。
總結(jié) :innodb整體性能遠(yuǎn)高于myisam瓢省。同時弄息,innodb的索引不僅需要緩存索引本身,也緩存數(shù)據(jù)勤婚,所以innodb需要更大的內(nèi)存摹量。如果你不知道一個表需要使用什么存儲引擎,建議使用innodb馒胆。
2.樂觀鎖和悲觀鎖的區(qū)別缨称?
悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀祝迂,每次去拿數(shù)據(jù)的時候都認(rèn)為別人會修改睦尽,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會block直到它拿到鎖型雳。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制当凡,比如行鎖,表鎖等纠俭,讀鎖沿量,寫鎖等,都是在做操作之前先上鎖冤荆。
樂觀鎖(Optimistic Lock), 顧名思義朴则,就是很樂觀,每次去拿數(shù)據(jù)的時候都認(rèn)為別人不會修改匙赞,所以不會上鎖佛掖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù)妖碉,可以使用版本號等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型芥被,這樣可以提高吞吐量欧宜,像數(shù)據(jù)庫如果提供類似于write_condition機(jī)制的其實(shí)都是提供的樂觀鎖。
兩種鎖各有優(yōu)缺點(diǎn)拴魄,不可認(rèn)為一種好于另一種冗茸,像樂觀鎖適用于寫比較少的情況下,即沖突真的很少發(fā)生的時候匹中,這樣可以省去了鎖的開銷夏漱,加大了系統(tǒng)的整個吞吐量。但如果經(jīng)常產(chǎn)生沖突顶捷,上層應(yīng)用會不斷的進(jìn)行retry挂绰,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適服赎。
3.數(shù)據(jù)庫隔離級別是什么葵蒂?有什么作用?
MySQL事務(wù)隔離級別和Spring事務(wù)關(guān)系介紹
- 未提交讀(Read Uncommitted):允許臟讀重虑,也就是可能讀取到其他會話中未提交事務(wù)修改的數(shù)據(jù)
- 提交讀(Read Committed):只能讀取到已經(jīng)提交的數(shù)據(jù)践付。Oracle等多數(shù)數(shù)據(jù)庫默認(rèn)都是該級別 (不重復(fù)讀)
- 可重復(fù)讀(Repeated Read):可重復(fù)讀。在同一個事務(wù)內(nèi)的查詢都是事務(wù)開始時刻一致的缺厉,InnoDB默認(rèn)級別永高。在SQL標(biāo)準(zhǔn)中,該隔離級別消除了不可重復(fù)讀提针,但是還存在幻象讀命爬,但是innoDB解決了幻讀
- 串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級共享鎖关贵,讀寫相互都會阻塞
4.MySQL主備同步的基本原理遇骑。
mysql支持單向、異步復(fù)制揖曾,復(fù)制過程中一個服務(wù)器充當(dāng)主服務(wù)器落萎,而一個或多個其它服務(wù)器充當(dāng)從服務(wù)器。mysql復(fù)制基于主服務(wù)器在二進(jìn)制日志中跟蹤所有對數(shù)據(jù)庫的更改(更新炭剪、刪除等等)练链。因此,要進(jìn)行復(fù)制奴拦,必須在主服務(wù)器上啟用二進(jìn)制日志媒鼓。每個從服務(wù)器從主服務(wù)器接收主服務(wù)器已經(jīng)記錄到其二進(jìn)制日志的保存的更新。
當(dāng)一個從服務(wù)器連接主服務(wù)器時,它通知主服務(wù)器從服務(wù)器在日志中讀取的最后一次成功更新的位置绿鸣。從服務(wù)器接收從那時起發(fā)生的任何更新疚沐,并在本機(jī)上執(zhí)行相同的更新。然后封鎖并等待主服務(wù)器通知新的更新潮模。從服務(wù)器執(zhí)行備份不會干擾主服務(wù)器亮蛔,在備份過程中主服務(wù)器可以繼續(xù)處理更新。
5.select * from table t where size > 10 group by size order by size的sql語句執(zhí)行順序擎厢?
Mysql的執(zhí)行順序是如下
FORM: 對FROM的左邊的表和右邊的表計(jì)算笛卡爾積究流。產(chǎn)生虛表VT1
ON: 對虛表VT1進(jìn)行ON篩選,只有那些符合<join-condition>的行才會被記錄在虛表VT2中动遭。
JOIN: 如果指定了OUTER JOIN(比如left join芬探、 right join),那么保留表中未匹配的行就會作為外部行添加到虛擬表VT2中厘惦,產(chǎn)生虛擬表VT3, rug from子句中包含兩個以上的表的話偷仿,那么就會對上一個join連接產(chǎn)生的結(jié)果VT3和下一個表重復(fù)執(zhí)行步驟1~3這三個步驟,一直到處理完所有的表為止宵蕉。
WHERE: 對虛擬表VT3進(jìn)行WHERE條件過濾炎疆。只有符合<where-condition>的記錄才會被插入到虛擬表VT4中。
GROUP BY: 根據(jù)group by子句中的列国裳,對VT4中的記錄進(jìn)行分組操作,產(chǎn)生VT5.
CUBE | ROLLUP: 對表VT5進(jìn)行cube或者rollup操作全跨,產(chǎn)生表VT6.
HAVING: 對虛擬表VT6應(yīng)用having過濾缝左,只有符合<having-condition>的記錄才會被 插入到虛擬表VT7中。
SELECT: 執(zhí)行select操作浓若,選擇指定的列渺杉,插入到虛擬表VT8中。
DISTINCT: 對VT8中的記錄進(jìn)行去重挪钓。產(chǎn)生虛擬表VT9.
ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進(jìn)行排序操作是越,產(chǎn)生虛擬表VT10.
LIMIT:取出指定行的記錄,產(chǎn)生虛擬表VT11, 并將結(jié)果返回碌上。
因此執(zhí)行順序?qū)⑹?from table t
> where size > 10
> group by size
> order by size
6.如何優(yōu)化數(shù)據(jù)庫性能
(索引倚评、分庫分表、批量操作馏予、分頁算法天梧、升級硬盤SSD、業(yè)務(wù)優(yōu)化霞丧、主從部署)
7.SQL什么情況下不會使用索引
(不包含呢岗,不等于,函數(shù))
1、建立組合索引后豫,但查詢謂詞并未使用組合索引的第一列悉尾,此處有一個INDEX SKIP SCAN概念。
2挫酿、在包含有null值的table列上建立索引构眯,當(dāng)時使用select count(*) from table時不會使用索引。
3饭豹、在索引列上使用函數(shù)時不會使用索引鸵赖,如果一定要使用索引只能建立函數(shù)索引。
4拄衰、當(dāng)被索引的列進(jìn)行隱式的類型轉(zhuǎn)換時不會使用索引它褪。如:select * from t where indexed_column = 5,而indexed_column列建立索引但類型是字符型翘悉,這時Oracle會產(chǎn)生
隱式的類型轉(zhuǎn)換茫打,轉(zhuǎn)換后的語句類似于select * from t where to_number(indexed_column) = 5,此時不走索引的情況類似于case3妖混。日期轉(zhuǎn)換也有類似問題老赤,如:
select * from t where trunc(date_col) = trunc(sysdate)其中date_col為索引列,這樣寫不會走索引制市,可改寫成select * from t where date_col >= trunc(sysdate)
and date_col < trunc(sysdate+1)抬旺,此查詢會走索引。
5祥楣、并不是所有情況使用索引都會加快查詢速度开财,full scan table 有時會更快,尤其是當(dāng)查詢的數(shù)據(jù)量占整個表的比重較大時误褪,因?yàn)閒ull scan table采用的是多塊讀责鳍,
當(dāng)Oracle優(yōu)化器沒有選擇使用索引時不要立即強(qiáng)制使用,要充分證明使用索引確實(shí)查詢更快時再使用強(qiáng)制索引兽间。
6历葛、<>
7、like’%dd’百分號在前
8嘀略、not in ,not exist.
8.一般在什么字段上建索引(過濾數(shù)據(jù)最多的字段)
1恤溶、表的主鍵、外鍵必須有索引屎鳍;
2宏娄、數(shù)據(jù)量超過300的表應(yīng)該有索引;
3逮壁、經(jīng)常與其他表進(jìn)行連接的表孵坚,在連接字段上應(yīng)該建立索引粮宛;
4、經(jīng)常出現(xiàn)在Where子句中的字段卖宠,特別是大表的字段巍杈,應(yīng)該建立索引;
5扛伍、索引應(yīng)該建在選擇性高的字段上筷畦;
6、索引應(yīng)該建在小字段上刺洒,對于大的文本字段甚至超長字段鳖宾,不要建索引;
7逆航、復(fù)合索引的建立需要進(jìn)行仔細(xì)分析鼎文;盡量考慮用單字段索引代替:
9.如何從一張表中查出name字段不包含“XYZ”的所有行?
select * from t where t.name NOT LIKE ‘%XYZ%'
10.MySQL因俐,B+索引實(shí)現(xiàn)拇惋,行鎖實(shí)現(xiàn),SQL優(yōu)化
11.Redis抹剩,RDB和AOF撑帖,如何做高可用、集群
RDB持久化是指在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤澳眷。 也是默認(rèn)的持久化方式胡嘿,這種方式是就是將內(nèi)存中數(shù)據(jù)以快照的方式寫入到二進(jìn)制文件中,默認(rèn)的文件名為dump.rdb。
redis會將每一個收到的寫命令都通過write函數(shù)追加到文件中(默認(rèn)是 appendonly.aof)钳踊。
12.如何解決高并發(fā)減庫存問題
13.mysql存儲引擎中索引的實(shí)現(xiàn)機(jī)制灶平;
14.數(shù)據(jù)庫事務(wù)的幾種粒度;
事務(wù)(Transaction)及其ACID屬性
事務(wù)是由一組SQL語句組成的邏輯處理單元箍土,事務(wù)具有以下4個屬性,通常簡稱為事務(wù)的ACID屬性罐监。
- 原子性(Atomicity):事務(wù)是一個原子操作單元吴藻,其對數(shù)據(jù)的修改,要么全都執(zhí)行弓柱,要么全都不執(zhí)行沟堡。
- 一致性(Consistent):在事務(wù)開始和完成時,數(shù)據(jù)都必須保持一致狀態(tài)矢空。這意味著所有相關(guān)的數(shù)據(jù)規(guī)則都必須應(yīng)用于事務(wù)的修改航罗,以保持?jǐn)?shù)據(jù)的完整性;事務(wù)結(jié)束時屁药,所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如B樹索引或雙向鏈表)也都必須是正確的粥血。
- 隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的“獨(dú)立”環(huán)境執(zhí)行。這意味著事務(wù)處理過程中的中間狀態(tài)對外部是不可見的复亏,反之亦然趾娃。
- 持久性(Durable):事務(wù)完成之后,它對于數(shù)據(jù)的修改是永久性的缔御,即使出現(xiàn)系統(tǒng)故障也能夠保持抬闷。
另外就是3題內(nèi)容。
15.行鎖耕突,表鎖笤成;樂觀鎖,悲觀鎖
目錄列表
一眷茁、數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)
二炕泳、Java基礎(chǔ)
三、JVM
四蔼卡、多線程/并發(fā)
五喊崖、Linux使用與問題分析排查
六、框架使用
七雇逞、數(shù)據(jù)庫相關(guān)
八荤懂、網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)編程
九、Redis等緩存系統(tǒng)/中間件/NoSQL/一致性Hash等
十塘砸、設(shè)計(jì)模式與重構(gòu)
本文是針對知乎文章《成為Java頂尖程序員节仿,先過了下面問題》的解答