www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]為了便于大家查找問題,了解全貌,整理個目錄,我們可以快速全局了解關(guān)于mysql數(shù)據(jù)庫,面試官一般喜歡問哪些問題接下來,我們逐條來看看每個問題及答案MyISAM和InnoDB的區(qū)別?答案:InnoDB支持事務(wù)、外鍵、聚集索引,通過MVCC來支持高并發(fā),索引和數(shù)據(jù)存儲在一起。Inno...


為了便于大家查找問題,了解全貌,整理個目錄,我們可以快速全局了解關(guān)于mysql數(shù)據(jù)庫,面試官一般喜歡問哪些問題


MYSQL?那點破事!索引、SQL調(diào)優(yōu)、事務(wù)、B 樹、分表?....


接下來,我們逐條來看看每個問題及答案


MyISAM 和 InnoDB 的區(qū)別?

答案:InnoDB 支持 事務(wù)、外鍵、聚集索引,通過MVCC來支持高并發(fā),索引和數(shù)據(jù)存儲在一起。InnoDB 不保存表的具體行數(shù),執(zhí)行 select count(*) from table 時需要全表掃描。而MyISAM 用一個變量保存了整個表的行數(shù)。

InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖,并發(fā)能力低。MySQL 將默認存儲引擎是 InnoDB


mysql 鎖有哪些類型?

答案:mysql鎖分為共享鎖( S lock ) 、排他鎖 ( X lock ),也叫做讀鎖和寫鎖。根據(jù)粒度,可以分為表鎖、頁鎖、行鎖。


什么是間隙鎖?

答案:間隙鎖是可重復(fù)讀級別下才會有的鎖,mysql會幫我們生成了若干左開右閉的區(qū)間,結(jié)合MVCC和間隙鎖可以解決幻讀問題。


如何避免死鎖?

答案:死鎖的四個必要條件:1、互斥 2、請求與保持 3、環(huán)路等待 4、不可剝奪。

  • 合理的設(shè)計索引,區(qū)分度高的列放到組合索引前面,使業(yè)務(wù) SQL 盡可能通過索引定位更少的行,減少鎖競爭。
  • 調(diào)整業(yè)務(wù)邏輯 SQL 執(zhí)行順序, 避免 update/delete 長時間持有鎖的 SQL 在事務(wù)前面。
  • 避免大事務(wù),將大事務(wù)拆成多個小事務(wù)
  • 以固定的順序訪問表和行。比如兩個更新數(shù)據(jù)的事務(wù),事務(wù) A 更新數(shù)據(jù)的順序為 1,2;事務(wù) B 更新數(shù)據(jù)的順序為 2,1。這樣更可能會造成死鎖。
  • 在并發(fā)比較高的系統(tǒng)中,不要顯式加鎖,特別是是在事務(wù)里顯式加鎖。如 select … for update 語句,如果是在事務(wù)里(運行了 start transaction 或設(shè)置了autocommit 等于0),那么就會鎖定所查找到的記錄。
  • 盡量用主鍵/索引去查找記錄
  • 優(yōu)化 SQL 和表設(shè)計,減少同時占用太多資源的情況。比如說,避免多個表join,將復(fù)雜 SQL 分解為多個簡單的 SQL。

數(shù)據(jù)庫的隔離級別?

答案:讀未提交、讀已提交、可重復(fù)讀(mysql的默認級別,每次讀取結(jié)果都一樣,但是有可能產(chǎn)生幻讀)、串行化。


Mysql有哪些類型的索引?

答案:

  • 普通索引:一個索引只包含一個列,一個表可以有多個單列索引。
  • 唯一索引:索引列的值必須唯一,但允許有空值
  • 復(fù)合索引:多列值組成一個索引,專門用于組合搜索,其效率大于索引合并
  • 聚簇索引:也稱為主鍵索引,是一種數(shù)據(jù)存儲方式。B Tree結(jié)構(gòu),非葉子節(jié)點包含健值和指針,葉子節(jié)點包含索引列和行數(shù)據(jù)。一張表只能有一個聚簇索引。
  • 非聚簇索引:不是聚簇索引,就是非聚簇索引。葉子節(jié)點只是存索引列和主鍵id。如果sql還要返回除了索引列的其他字段信息,需要回表,第一次索引一般是順序IO,回表的操作屬于隨機IO?;乇淼拇螖?shù)越多,性能越差。此時我們推薦覆蓋索引

什么是覆蓋索引和回表?

答案:

1、覆蓋索引,指的是在一次查詢中,一個索引包含所有需要查詢的字段的值,可能是返回值或where條件

select?buyer_id?from?order?where?money>100
假如我們創(chuàng)建了一個(money,buyer_id)的聯(lián)合索引,索引的葉子節(jié)點包含了buyer_id的信息,則不會再回表查詢。

2、回表,指查詢時一些字段值拿不到,需要到主鍵索引B 樹再查一次。


Mysql的最左前綴原則?

答案:即最左優(yōu)先,在檢索數(shù)據(jù)時從聯(lián)合索引的最左邊開始匹配,直到遇到范圍查詢(如:> 、< 、between、like等)

例子:where a = 1 and b = 2 and c > 3 and d = 4 ,如果建立(a,b,c,d)組合索引,d是用不到索引的;如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調(diào)整。


線上SQL的調(diào)優(yōu)經(jīng)驗?

答案:

  • 1、slow_query_log 日志中收集到的慢 SQL ,結(jié)合 explain 分析是否命中索引。
  • 2、減少索引掃描行數(shù),有針對性的優(yōu)化慢 SQL。
  • 3、建立聯(lián)合索引,由于聯(lián)合索引的每個葉子節(jié)點包含檢索字段的信息,按最左前綴原則匹配后,再按其它條件過濾,減少回表的數(shù)據(jù)量。
  • 4、還可以使用虛擬列和聯(lián)合索引來提升復(fù)雜查詢的執(zhí)行效率。

官方為什么建議采用自增id 作為主鍵?

答案:自增id是連續(xù)的,插入過程也是順序的,總是插入在最后,減少了頁分裂,有效減少數(shù)據(jù)的移動。所以盡量不要使用字符串(如:UUID)作為主鍵。

索引為什么采用B 樹,而不用B-樹,紅黑樹?

答案:提升查詢速度,首先要減少磁盤IO次數(shù),也就是要降低樹的高度。

  • 平衡二叉樹、紅黑樹,都屬于二叉樹。時間復(fù)雜度為O(n),當(dāng)表的數(shù)據(jù)量上千萬時,樹的深度很深,mysql讀取時消耗大量 IO。另外,InnoDB引擎采用為單位讀取,每個節(jié)點一頁,但是二叉樹每個節(jié)點儲存一個關(guān)鍵詞,導(dǎo)致空間浪費。
  • B-樹,非葉子節(jié)點存儲數(shù)據(jù),占用較多空間,導(dǎo)致每個節(jié)點的指針少很多,無形增加了樹的深度。
  • B 樹數(shù)據(jù)都存儲在葉子節(jié)點,非葉子節(jié)點只存儲健值 指針,索引樹更加扁平,三層深度可以支持千萬級表存儲。同時葉子節(jié)點之間通過鏈表關(guān)聯(lián),范圍查找更快。
  • 更多內(nèi)容,參考 mysql 一棵 B 樹能存多少條數(shù)據(jù)?

事務(wù)的特性有哪些?

答案:ACID。

  • 原子性。一個事務(wù)中的操作要么全部成功,要么全部失敗。
  • 持久性。永久保存在數(shù)據(jù)庫中。
  • 一致性??偸菑囊粋€一致性的狀態(tài)轉(zhuǎn)換到另一個一致性的狀態(tài)
  • 隔離性。一個事務(wù)的修改在提交前,其他事務(wù)是感知不到的

如何實現(xiàn)分布式事務(wù)?

答案:

  • 1、流水任務(wù),最終一致性,前提是接口要支持冪等性
  • 2、事務(wù)消息
  • 3、二階段提交
  • 4、三階段提交
  • 5、TCC
  • 6、Seata 框架
  • 7、更多內(nèi)容,參考 如何解決分布式事務(wù)

日常工作中,MySQL 如何做優(yōu)化?

答案:

  • 1、分頁優(yōu)化。比如電梯直達,limit 100000,10 先查找起始的主鍵id,再通過id>#{value}往后取10條
  • 2、盡量使用覆蓋索引,索引的葉節(jié)點中已經(jīng)包含要查詢的字段,減少回表查詢
  • 3、SQL優(yōu)化(索引優(yōu)化、小表驅(qū)動大表、虛擬列、適當(dāng)增加冗余字段減少連表查詢、聯(lián)合索引、排序優(yōu)化、慢日志 Explain 分析執(zhí)行計劃)。
  • 4、設(shè)計優(yōu)化(避免使用NULL、用簡單數(shù)據(jù)類型如int、減少 text 類型、分庫分表)。
  • 5、硬件優(yōu)化(使用SSD 減少 I/O 時間、足夠大的網(wǎng)絡(luò)帶寬、盡量大的內(nèi)存)

mysql 主從同步具體過程?

答案:

  • master主庫,有數(shù)據(jù)更新,將此次更新的事件類型寫入到主庫的binlog文件中
  • 主庫會創(chuàng)建log dump 線程通知slave有數(shù)據(jù)更新
  • slave,向master節(jié)點的 log dump線程請求一份指定binlog文件位置的副本,并將請求回來的binlog存到本地的Relay log 中繼日志中
  • slave 再開啟一個SQL 線程讀取Relay log事件,并在本地執(zhí)行redo操作。將發(fā)生在主庫的事件在本地重新執(zhí)行一遍,從而保證主從數(shù)據(jù)同步
MYSQL?那點破事!索引、SQL調(diào)優(yōu)、事務(wù)、B 樹、分表?....



什么是主從延遲?

答案:指一個寫入SQL操作在主庫執(zhí)行完后,將數(shù)據(jù)完整同步到從庫會有一個時間差,稱之為主從延遲。計算公式:

  • 主庫生成一條寫入SQL的binlog,里面會有一個時間字段,記錄寫入的時間戳 t1
  • binlog 同步到從庫后,一旦開始執(zhí)行,取當(dāng)前時間 t2
  • t2-t1,就是延遲時間
注意:不同服務(wù)器要保持時鐘一致


主從延遲排查方法?

答案:通過 show slave status 命令輸出的Seconds_Behind_Master參數(shù)的值來判斷

MYSQL?那點破事!索引、SQL調(diào)優(yōu)、事務(wù)、B 樹、分表?....

  • 為零:表示主從復(fù)制良好
  • 正值:表示主從已經(jīng)出現(xiàn)延時,數(shù)字越大,表示從庫延遲越嚴重

主從延遲要怎么解決?

答案:

  • 看業(yè)務(wù)的接受程度。如果不能接受延遲,那么建議強制走主庫查詢
  • 可以考慮引入緩存,更新主庫后同步寫入緩存,保證緩存的及時性
  • 提升從庫的機器配置,提高從庫binlog的同步效率
  • 縮短主、從庫的網(wǎng)絡(luò)距離,減少binlog的網(wǎng)絡(luò)傳輸時間
  • 一主多從,每個從庫都啟一個線程從主庫同步 binlog,導(dǎo)致主庫壓力過大,可以采用canal 增量訂閱
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉