<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
給面試官講一下 MySQL 的邏輯架構,有白板可以把下面的圖畫一下,圖片來源於網路。
Mysql邏輯架構圖主要分三層:
(1)第一層負責連線處理,授權認證,安全等等
(2)第二層負責編譯並優化SQL
(3)第三層是儲存引擎。
先檢查該語句是否有許可權,如果沒有許可權,直接返回錯誤資訊,如果有許可權會先查詢快取(MySQL8.0 版本以前)。
如果沒有快取,分析器進行詞法分析,提取 sql 語句中 select 等關鍵元素,然後判斷 sql 語句是否有語法錯誤,比如關鍵詞是否正確等等。
最後優化器確定執行方案進行許可權校驗,如果沒有許可權就直接返回錯誤資訊,如果有許可權就會呼叫資料庫引擎介面,返回執行結果。
可以從這幾個維度回答這個問題:
(1)儘量使用數位型欄位
若只含數值資訊的欄位儘量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連線時會逐個比較字串中每一個字元,而對於數位型而言只需要比較一次就夠了。
(2)儘可能的使用 varchar 代替 char
變長欄位儲存空間小,可以節省儲存空間。
(3)當索引列大量重複資料時,可以把索引刪除掉
比如有一列是性別,幾乎只有男、女、未知,這樣的索引是無效的。
對作為查詢條件和 order by的欄位建立索引
避免建立過多的索引,多使用組合索引
在 select 語句之前增加 explain 關鍵字,會返回執行計劃的資訊。
(1)id 列:是 select 語句的序號,MySQL將 select 查詢分為簡單查詢和複雜查詢。
(2)select_type列:表示對應行是是簡單還是複雜的查詢。
(3)table 列:表示 explain 的一行正在存取哪個表。
(4)type 列:最重要的列之一。表示關聯型別或存取型別,即 MySQL 決定如何查詢表中的行。從最優到最差分別為:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
(5)possible_keys 列:顯示查詢可能使用哪些索引來查詢。
(6)key 列:這一列顯示 mysql 實際採用哪個索引來優化對該表的存取。
(7)key_len 列:顯示了mysql在索引裡使用的位元組數,通過這個值可以算出具體使用了索引中的哪些列。
(8)ref 列:這一列顯示了在key列記錄的索引中,表查詢值所用到的列或常數,常見的有:const(常數),func,NULL,欄位名。
(9)rows 列:這一列是 mysql 估計要讀取並檢測的行數,注意這個不是結果集裡的行數。
(10)Extra 列:顯示額外資訊。比如有 Using index、Using where、Using temporary等。
我們平時寫Sql時,都要養成用explain分析的習慣。慢查詢的統計,運維會定期統計給我們
優化慢查詢思路:
可以按以下四個維度回答:
(1)一個表中只能擁有一個聚集索引,而非聚集索引一個表可以存在多個。
(2)聚集索引,索引中鍵值的邏輯順序決定了表中相應行的物理順序;非聚集索引,索引中索引的邏輯順序與磁碟上行的物理儲存順序不同。
(3)索引是通過二元樹的資料結構來描述的,我們可以這麼理解聚簇索引:索引的葉節點就是資料節點。而非聚簇索引的葉節點仍然是索引節點,只不過有一個指標指向對應的資料塊。
(4)聚集索引:物理儲存按照索引排序;非聚集索引:物理儲存不按照索引排序;
可以從幾個維度去看這個問題,查詢是否夠快,效率是否穩定,儲存資料多少,以及查詢磁碟次數,為什麼不是普通二元樹,為什麼不是平衡二元樹,為什麼不是B樹,而偏偏是 B+ 樹呢?
如果二元樹特殊化為一個連結串列,相當於全表掃描。平衡二元樹相比於二叉查詢樹來說,查詢效率更穩定,總體的查詢速度也更快。
我們知道,在記憶體比在磁碟的資料,查詢效率快得多。如果樹這種資料結構作為索引,那我們每查詢一次資料就需要從磁碟中讀取一個節點,也就是我們說的一個磁碟塊,但是平衡二元樹可是每個節點只儲存一個鍵值和資料的,如果是B樹,可以儲存更多的節點資料,樹的高度也會降低,因此讀取磁碟的次數就降下來啦,查詢效率就快啦。
B+ 樹非葉子節點上是不儲存資料的,僅儲存鍵值,而B樹節點中不僅儲存鍵值,也會儲存資料。innodb中頁的預設大小是16KB,如果不儲存資料,那麼就會儲存更多的鍵值,相應的樹的階數(節點的子節點樹)就會更大,樹就會更矮更胖,如此一來我們查詢資料進行磁碟的IO次數有會再次減少,資料查詢的效率也會更快。
B+ 樹索引的所有資料均儲存在葉子節點,而且資料是按照順序排列的,連結串列連著的。那麼 B+ 樹使得範圍查詢,排序查詢,分組查詢以及去重查詢變得異常簡單。
B+ 樹可以進行範圍查詢,Hash 索引不能。
B+ 樹支援聯合索引的最左側原則,Hash 索引不支援。
B+ 樹支援 order by 排序,Hash 索引不支援。
Hash 索引在等值查詢上比 B+ 樹效率更高。
B+ 樹使用 like 進行模糊查詢的時候,like 後面(比如%開頭)的話可以起到優化的作用,Hash 索引根本無法進行模糊查詢。
最左字首原則,就是最左優先,在建立多列索引時,要根據業務需求,where 子句中使用最頻繁的一列放在最左邊。
當我們建立一個組合索引的時候,如 (a1,a2,a3),相當於建立了(a1)、(a1,a2)和(a1,a2,a3)三個索引,這就是最左匹配原則。
資料量少的不適合加索引
更新比較頻繁的也不適合加索引 = 區分度低的欄位不適合加索引(如性別)
(1) 優點:
唯一索引可以保證資料庫表中每一行的資料的唯一性
索引可以加快資料查詢速度,減少查詢時間
(2)缺點:
建立索引和維護索引要耗費時間
索引需要佔物理空間,除了資料表佔用資料空間之外,每一個索引還要佔用一定的物理空間
以表中的資料進行增、刪、改的時候,索引也要動態的維護。
遇到過。我排查死鎖的一般步驟是醬紫的:
(1)檢視死鎖紀錄檔 show engine innodb status;
(2)找出死鎖Sql
(3)分析sql加鎖情況
(4)模擬死鎖案發
(5)分析死鎖紀錄檔
(6)分析死鎖結果
(1)悲觀鎖:
悲觀鎖她專一且缺乏安全感了,她的心只屬於當前事務,每時每刻都擔心著它心愛的資料可能被別的事務修改,所以一個事務擁有(獲得)悲觀鎖後,其他任何事務都不能對資料進行修改啦,只能等待鎖被釋放才可以執行。
(2)樂觀鎖:
樂觀鎖的“樂觀情緒”體現在,它認為資料的變動不會太頻繁。因此,它允許多個事務同時對資料進行變動。
實現方式:樂觀鎖一般會使用版本號機制或CAS演演算法實現。
MVCC (Multiversion Concurrency Control),即多版本並行控制技術。
MVCC在MySQL InnoDB中的實現主要是為了提高資料庫並行效能,用更好的方式去處理讀-寫衝突,做到即使有讀寫衝突時,也能做到不加鎖,非阻塞並行讀。
Mysql預設的事務隔離級別是可重複讀(Repeatable Read)
事務A、B交替執行,事務A被事務B干擾到了,因為事務A讀取到事務B未提交的資料,這就是髒讀。
在一個事務範圍內,兩個相同的查詢,讀取同一條記錄,卻返回了不同的資料,這就是不可重複讀。
事務A查詢一個範圍的結果集,另一個並行事務B往這個範圍中插入/刪除了資料,並靜悄悄地提交,然後事務A再次查詢相同的範圍,兩次讀取得到的結果集不一樣了,這就是幻讀。
排查過程:
(1)使用top 命令觀察,確定是mysqld導致還是其他原因。
(2)如果是mysqld導致的,show processlist,檢視session情況,確定是不是有消耗資源的sql在執行。
(3)找出消耗高的 sql,看看執行計劃是否準確, 索引是否缺失,資料量是否太大。
處理:
(1)kill 掉這些執行緒(同時觀察 cpu 使用率是否下降)
(2)進行相應的調整(比如說加索引、改 sql、改記憶體引數)
(3)重新跑這些 SQL。
其他情況:
也有可能是每個 sql 消耗資源並不多,但是突然之間,有大量的 session 連進來導致 cpu 飆升,這種情況就需要跟應用一起來分析為何連線數會激增,再做出相應的調整,比如說限制連線數等
主從複製分了五個步驟進行:(圖片來源於網路)
步驟一:主庫的更新事件(update、insert、delete)被寫到binlog
步驟二:從庫發起連線,連線到主庫。
步驟三:此時主庫建立一個binlog dump thread,把binlog的內容傳送到從庫。
步驟四:從庫啟動之後,建立一個I/O執行緒,讀取主庫傳過來的binlog內容並寫入到relay log
步驟五:還會建立一個SQL執行緒,從relay log裡面讀取內容,從Exec_Master_Log_Pos位置開始執行讀取到的更新事件,將更新內容寫入到slave的db
一個伺服器開放N個連結給使用者端來連線的,這樣有會有大並行的更新操作, 但是從伺服器的裡面讀取binlog的執行緒僅有一個,當某個SQL在從伺服器上執行的時間稍長 或者由於某個SQL要進行鎖表就會導致,主伺服器的SQL大量積壓,未被同步到從伺服器裡。這就導致了主從不一致, 也就是主從延遲。
主伺服器要負責更新操作,對安全性的要求比從伺服器要高,所以有些設定引數可以修改,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之類的設定等。
選擇更好的硬體裝置作為slave。
把一臺從伺服器當度作為備份使用, 而不提供查詢, 那邊他的負載下來了, 執行relay log 裡面的SQL效率自然就高了。
增加從伺服器嘍,這個目的還是分散讀的壓力,從而降低伺服器負載。
水平分庫:以欄位為依據,按照一定策略(hash、range等),將一個庫中的資料拆分到多個庫中。
水平分表:以欄位為依據,按照一定策略(hash、range等),將一個表中的資料拆分到多個表中。
垂直分庫:以表為依據,按照業務歸屬不同,將不同的表拆分到不同的庫中。
垂直分表:以欄位為依據,按照欄位的活躍性,將表中欄位拆到不同的表(主表和擴充套件表)中。
sharding-jdbc
Mycat
事務問題:需要用分散式事務啦
跨節點Join的問題:解決這一問題可以分兩次查詢實現
跨節點的count,order by,group by以及聚合函數問題:分別在各個節點上得到結果後在應用程式端進行合併。
資料遷移,容量規劃,擴容等問題
ID問題:資料庫被切分後,不能再依賴資料庫自身的主鍵生成機制啦,最簡單可以考慮UUID
跨分片的排序分頁問題
以上就是面試中老生常談的MySQL問答集錦夯實基礎的詳細內容,更多關於MySQL面試問答集錦的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45