成為Java頂尖程序員,先過了下面問題?旒(七)

七贡羔、數(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)系介紹

mysql-stran.jpg
  • 未提交讀(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í)行順序是如下

  1. FORM: 對FROM的左邊的表和右邊的表計(jì)算笛卡爾積究流。產(chǎn)生虛表VT1

  2. ON: 對虛表VT1進(jìn)行ON篩選,只有那些符合<join-condition>的行才會被記錄在虛表VT2中动遭。

  3. JOIN: 如果指定了OUTER JOIN(比如left join芬探、 right join),那么保留表中未匹配的行就會作為外部行添加到虛擬表VT2中厘惦,產(chǎn)生虛擬表VT3, rug from子句中包含兩個以上的表的話偷仿,那么就會對上一個join連接產(chǎn)生的結(jié)果VT3和下一個表重復(fù)執(zhí)行步驟1~3這三個步驟,一直到處理完所有的表為止宵蕉。

  4. WHERE: 對虛擬表VT3進(jìn)行WHERE條件過濾炎疆。只有符合<where-condition>的記錄才會被插入到虛擬表VT4中。

  5. GROUP BY: 根據(jù)group by子句中的列国裳,對VT4中的記錄進(jìn)行分組操作,產(chǎn)生VT5.

  6. CUBE | ROLLUP: 對表VT5進(jìn)行cube或者rollup操作全跨,產(chǎn)生表VT6.

  7. HAVING: 對虛擬表VT6應(yīng)用having過濾缝左,只有符合<having-condition>的記錄才會被 插入到虛擬表VT7中。

  8. SELECT: 執(zhí)行select操作浓若,選擇指定的列渺杉,插入到虛擬表VT8中。

  9. DISTINCT: 對VT8中的記錄進(jìn)行去重挪钓。產(chǎn)生虛擬表VT9.

  10. ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進(jìn)行排序操作是越,產(chǎn)生虛擬表VT10.

  11. 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頂尖程序員节仿,先過了下面問題》的解答

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掉蔬,隨后出現(xiàn)的幾起案子廊宪,更是在濱河造成了極大的恐慌,老刑警劉巖女轿,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箭启,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛉迹,警方通過查閱死者的電腦和手機(jī)傅寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來北救,“玉大人荐操,你說我怎么就攤上這事≌洳撸” “怎么了托启?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攘宙。 經(jīng)常有香客問我屯耸,道長拐迁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任肩民,我火速辦了婚禮唠亚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘持痰。我一直安慰自己灶搜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布工窍。 她就那樣靜靜地躺著割卖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪患雏。 梳的紋絲不亂的頭發(fā)上鹏溯,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音淹仑,去河邊找鬼丙挽。 笑死,一個胖子當(dāng)著我的面吹牛匀借,可吹牛的內(nèi)容都是我干的颜阐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吓肋,長吁一口氣:“原來是場噩夢啊……” “哼凳怨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起是鬼,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤肤舞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后均蜜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體李剖,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年囤耳,在試婚紗的時候發(fā)現(xiàn)自己被綠了杖爽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡紫皇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腋寨,到底是詐尸還是另有隱情聪铺,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布萄窜,位于F島的核電站铃剔,受9級特大地震影響撒桨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜键兜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一凤类、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧普气,春花似錦谜疤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仔沿,卻和暖如春坐桩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背封锉。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工绵跷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人成福。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓碾局,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闷叉。 傳聞我的和親對象是個殘疾皇子擦俐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345