MySQL數據庫經典面試題解析

1. MySQL 索引使用有哪些注意事項呢?

可以從三個維度回答這個問題:索引哪些情況會失效,索引不適合哪些場景,索引規則

索引哪些情況會失效

  • 查詢條件包含or,可能導致索引失效
  • 如何字段類型是字符串,where時一定用引號括起來,否則索引失效
  • like通配符可能導致索引失效。
  • 聯合索引,查詢時的條件列不是聯合索引中的第一個列,索引失效。
  • 在索引列上使用mysql的內置函數,索引失效。
  • 對索引列運算(如,+、-、*、/),索引失效。
  • 索引字段上使用(!= 或者 < >,not in)時,可能會導致索引失效。
  • 索引字段上使用is null, is not null,可能導致索引失效。
  • 左連接查詢或者右連接查詢查詢關聯的字段編碼格式不一樣,可能導致索引失效。
  • mysql估計使用全表掃描要比使用索引快,則不使用索引。

索引不適合哪些場景

  • 數據量少的不適合加索引
  • 更新比較頻繁的也不適合加索引
  • 區分度低的字段不適合加索引(如性別)

索引的一些潛規則

  • 覆蓋索引
  • 回表
  • 索引數據結構(B+樹)
  • 最左前綴原則
  • 索引下推

2. MySQL 遇到過死鎖問題嗎,你是如何解決的?

我排查死鎖的一般步驟是醬紫的:

  • 查看死鎖日志show engine innodb status;
  • 找出死鎖Sql
  • 分析sql加鎖情況
  • 模擬死鎖案發
  • 分析死鎖日志
  • 分析死鎖結果

3. 日常工作中你是怎么優化SQL的?

可以從這幾個維度回答這個問題:

  • 加索引
  • 避免返回不必要的數據
  • 適當分批量進行
  • 優化sql結構
  • 分庫分表
  • 讀寫分離

4. 說說分庫與分表的設計

分庫分表方案,分庫分表中間件,分庫分表可能遇到的問題

分庫分表方案:

  • 水平分庫:以字段為依據,按照一定策略(hash、range等),將一個庫中的數據拆分到多個庫中。
  • 水平分表:以字段為依據,按照一定策略(hash、range等),將一個表中的數據拆分到多個表中。
  • 垂直分庫:以表為依據,按照業務歸屬不同,將不同的表拆分到不同的庫中。
  • 垂直分表:以字段為依據,按照字段的活躍性,將表中字段拆到不同的表(主表和擴展表)中。

常用的分庫分表中間件:

  • sharding-jdbc(當當)
  • Mycat
  • TDDL(淘寶)
  • Oceanus(58同城數據庫中間件)
  • vitess(谷歌開發的數據庫中間件)
  • Atlas(Qihoo 360)

分庫分表可能遇到的問題

  • 事務問題:需要用分布式事務啦
  • 跨節點Join的問題:解決這一問題可以分兩次查詢實現
  • 跨節點的count,order by,group by以及聚合函數問題:分別在各個節點上得到結果后在應用程序端進行合并。
  • 數據遷移,容量規劃,擴容等問題
  • ID問題:數據庫被切分后,不能再依賴數據庫自身的主鍵生成機制啦,最簡單可以考慮UUID
  • 跨分片的排序分頁問題(后臺加大pagesize處理?)

5. InnoDB與MyISAM的區別

  • InnoDB支持事務,MyISAM不支持事務
  • InnoDB支持外鍵,MyISAM不支持外鍵
  • InnoDB 支持 MVCC(多版本并發控制),MyISAM 不支持
  • select count(*) from table時,MyISAM更快,因為它有一個變量保存了整個表的總行數,可以直接讀取,InnoDB就需要全表掃描。
  • Innodb不支持全文索引,而MyISAM支持全文索引(5.7以后的InnoDB也支持全文索引)
  • InnoDB支持表、行級鎖,而MyISAM支持表級鎖。
  • InnoDB表必須有主鍵,而MyISAM可以沒有主鍵
  • Innodb表需要更多的內存和存儲,而MyISAM可被壓縮,存儲空間較小,。
  • Innodb按主鍵大小有序插入,MyISAM記錄插入順序是,按記錄插入順序保存。
  • InnoDB 存儲引擎提供了具有提交、回滾、崩潰恢復能力的事務安全,與 MyISAM 比 InnoDB 寫的效率差一些,并且會占用更多的磁盤空間以保留數據和索引
  • InnoDB 屬于索引組織表,使用共享表空間和多表空間儲存數據。MyISAM用.frm.MYD.MTI來儲存表定義,數據和索引。

6. 數據庫索引的原理,為什么要用 B+樹,為什么不用二叉樹?

可以從幾個維度去看這個問題,查詢是否夠快,效率是否穩定,存儲數據多少,以及查找磁盤次數,為什么不是二叉樹,為什么不是平衡二叉樹,為什么不是B樹,而偏偏是B+樹呢?

為什么不是一般二叉樹?

如果二叉樹特殊化為一個鏈表,相當于全表掃描。平衡二叉樹相比于二叉查找樹來說,查找效率更穩定,總體的查找速度也更快。

為什么不是平衡二叉樹呢?

我們知道,在內存比在磁盤的數據,查詢效率快得多。如果樹這種數據結構作為索引,那我們每查找一次數據就需要從磁盤中讀取一個節點,也就是我們說的一個磁盤塊,但是平衡二叉樹可是每個節點只存儲一個鍵值和數據的,如果是B樹,可以存儲更多的節點數據,樹的高度也會降低,因此讀取磁盤的次數就降下來啦,查詢效率就快啦。

那為什么不是B樹而是B+樹呢?

  • 1)B+樹非葉子節點上是不存儲數據的,僅存儲鍵值,而B樹節點中不僅存儲鍵值,也會存儲數據。innodb中頁的默認大小是16KB,如果不存儲數據,那么就會存儲更多的鍵值,相應的樹的階數(節點的子節點樹)就會更大,樹就會更矮更胖,如此一來我們查找數據進行磁盤的IO次數有會再次減少,數據查詢的效率也會更快。
  • 2)B+樹索引的所有數據均存儲在葉子節點,而且數據是按照順序排列的,鏈表連著的。那么B+樹使得范圍查找,排序查找,分組查找以及去重查找變得異常簡單。

7. 聚集索引與非聚集索引的區別

  • 一個表中只能擁有一個聚集索引,而非聚集索引一個表可以存在多個。
  • 聚集索引,索引中鍵值的邏輯順序決定了表中相應行的物理順序;非聚集索引,索引中索引的邏輯順序與磁盤上行的物理存儲順序不同。
  • 索引是通過二叉樹的數據結構來描述的,我們可以這么理解聚簇索引:索引的葉節點就是數據節點。而非聚簇索引的葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。
  • 聚集索引:物理存儲按照索引排序;非聚集索引:物理存儲不按照索引排序;

何時使用聚集索引或非聚集索引?
在這里插入圖片描述

8. limit 1000000 加載很慢的話,你是怎么解決的呢?

方案一:如果id是連續的,可以這樣,返回上次查詢的最大記錄(偏移量),再往下limit

select id,name from employee where id>1000000 limit 10.

方案二:在業務允許的情況下限制頁數:

建議跟業務討論,有沒有必要查這么后的分頁啦。因為絕大多數用戶都不會往后翻太多頁。

方案三:order by + 索引(id為索引)

select id,name from employee order by id  limit 100000010
SELECT a.* FROM employee a, (select id from employee where 條件 LIMIT 1000000,10 ) b where a.id=b.id

方案四:利用延遲關聯或者子查詢優化超多分頁場景。(先快速定位需要獲取的id段,然后再關聯)

9. 如何選擇合適的分布式主鍵方案呢?

  • 數據庫自增長序列或字段。
  • UUID。
  • Redis生成ID
  • Twitter的snowflake算法
  • 利用zookeeper生成唯一ID
  • MongoDB的ObjectId

10. 事務的隔離級別有哪些?MySQL的默認隔離級別是什么?

  • 讀未提交(Read Uncommitted)
  • 讀已提交(Read Committed)
  • 可重復讀(Repeatable Read)
  • 串行化(Serializable)

Mysql默認的事務隔離級別是可重復讀(Repeatable Read)

11. 什么是幻讀,臟讀,不可重復讀呢?

  • 事務A、B交替執行,事務A被事務B干擾到了,因為事務A讀取到事務B未提交的數據,這就是臟讀
  • 在一個事務范圍內,兩個相同的查詢,讀取同一條記錄,卻返回了不同的數據,這就是不可重復讀。
  • 事務A查詢一個范圍的結果集,另一個并發事務B往這個范圍中插入/刪除了數據,并靜悄悄地提交,然后事務A再次查詢相同的范圍,兩次讀取得到的結果集不一樣了,這就是幻讀。

12. 在高并發情況下,如何做到安全的修改同一行數據?

要安全的修改同一行數據,就要保證一個線程在修改時其它線程無法更新這行記錄。一般有悲觀鎖和樂觀鎖兩種方案~

使用悲觀鎖

悲觀鎖思想就是,當前線程要進來修改數據時,別的線程都得拒之門外~
比如,可以使用select…for update ~

select * from User where name=‘jay’ for update

以上這條sql語句會鎖定了User表中所有符合檢索條件(name=‘jay’)的記錄。本次事務提交之前,別的線程都無法修改這些記錄。

使用樂觀鎖

樂觀鎖思想就是,有線程過來,先放過去修改,如果看到別的線程沒修改過,就可以修改成功,如果別的線程修改過,就修改失敗或者重試。實現方式:樂觀鎖一般會使用版本號機制或CAS算法實現。

13. 數據庫的樂觀鎖和悲觀鎖。

悲觀鎖:

悲觀鎖她專一且缺乏安全感了,她的心只屬于當前事務,每時每刻都擔心著它心愛的數據可能被別的事務修改,所以一個事務擁有(獲得)悲觀鎖后,其他任何事務都不能對數據進行修改啦,只能等待鎖被釋放才可以執行。
在這里插入圖片描述

樂觀鎖:

樂觀鎖的“樂觀情緒”體現在,它認為數據的變動不會太頻繁。因此,它允許多個事務同時對數據進行變動。實現方式:樂觀鎖一般會使用版本號機制或CAS算法實現。
在這里插入圖片描述

14. SQL優化的一般步驟是什么,怎么看執行計劃(explain),如何理解其中各個字段的含義。

  • show status 命令了解各種 sql 的執行頻率
  • 通過慢查詢日志定位那些執行效率較低的 sql 語句
  • explain 分析低效 sql 的執行計劃(這點非常重要,日常開發中用它分析Sql,會大大降低Sql導致的線上事故)

15. select for update有什么含義,會鎖表還是鎖行還是其他。

select for update 含義

select查詢語句是不會加鎖的,但是select for update除了有查詢的作用外,還會加鎖呢,而且它是悲觀鎖哦。至于加了是行鎖還是表鎖,這就要看是不是用了索引/主鍵啦。
沒用索引/主鍵的話就是表鎖,否則就是是行鎖。

16. MySQL事務得四大特性以及實現原理

在這里插入圖片描述

  • 原子性: 事務作為一個整體被執行,包含在其中的對數據庫的操作要么全部被執行,要么都不執行。
  • 一致性: 指在事務開始之前和事務結束以后,數據不會被破壞,假如A賬戶給B賬戶轉10塊錢,不管成功與否,A和B的總金額是不變的。
  • 隔離性: 多個事務并發訪問時,事務之間是相互隔離的,即一個事務不影響其它事務運行效果。簡言之,就是事務之間是進水不犯河水的。
  • 持久性: 表示事務完成以后,該事務對數據庫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77022.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77022.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77022.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#結合SQLite數據庫使用方法

一、關于SQLite SQLite 是一個輕量級的嵌入式關系型數據庫管理系統&#xff08;RDBMS&#xff09;。與傳統的數據庫管理系統&#xff08;如 MySQL、PostgreSQL 或 SQL Server&#xff09;不同&#xff0c;SQLite 并不需要運行單獨的服務器進程&#xff0c;它的數據庫存儲在一個…

深入解析 MySQL 中的日期時間函數:DATE_FORMAT 與時間查詢優化

深入解析 MySQL 中的日期時間函數&#xff1a;DATE_FORMAT 與時間查詢優化 在數據庫管理和應用開發中&#xff0c;日期和時間的處理是不可或缺的一部分。MySQL 提供了多種日期和時間函數來滿足不同的需求&#xff0c;其中DATE_FORMAT函數以其強大的日期格式化能力&#xff0c;…

如何深刻理解Reactor和Proactor

前言&#xff1a; 網絡框架的設計離不開 I/O 線程模型&#xff0c;線程模型的優劣直接決定了系統的吞吐量、可擴展性、安全性等。目前主流的網絡框架&#xff0c;在網絡 IO 處理層面幾乎都采用了I/O 多路復用方案(又以epoll為主)&#xff0c;這是服務端應對高并發的性能利器。 …

筆試專題(七)

文章目錄 乒乓球筐&#xff08;哈希&#xff09;題解代碼 組隊競賽題解代碼 刪除相鄰數字的最大分數&#xff08;線性dp&#xff09;題解代碼 乒乓球筐&#xff08;哈希&#xff09; 題目鏈接 題解 1. 兩個哈希表 先統計第一個字符串中的字符個數&#xff0c;再統計第二個字…

清晰易懂的 Flutter 卸載和清理教程

以下是為 Flutter 徹底卸載與清理教程&#xff0c;覆蓋 Windows、macOS、Linux 系統&#xff0c;步驟清晰無殘留&#xff0c;確保完全刪除 Flutter SDK、依賴工具及 IDE 配置。 一、通用步驟&#xff1a;確認 Flutter 安裝方式 Flutter 通常通過以下方式安裝&#xff1a; 手動…

關于反卷積

&#x1f9e0; 什么是反卷積&#xff1f; 反卷積&#xff08;Deconvolution&#xff09;&#xff0c;通常也稱為轉置卷積&#xff08;Transpose Convolution&#xff09;&#xff0c;是一種用于擴展輸入特征圖的操作&#xff0c;通常用于生成圖像或上采樣任務中。與標準卷積操…

【機器學習】ROC 曲線與 PR 曲線

目錄 一、混淆矩陣&#xff1a;分類評估的基礎 二. ROC 曲線 (Receiver Operating Characteristic Curve) 三. PR 曲線 (Precision-Recall Curve) 3.1 核心思想 4. 何時使用 ROC 曲線和 PR 曲線&#xff1f; 實驗結果 6. 總結 在機器學習的分類任務中&#xff0c;我們訓…

Python高階函數-map

map() 是 Python 內置的一個高階函數&#xff0c;它接收一個函數和一個可迭代對象作為參數&#xff0c;將函數依次作用在可迭代對象的每個元素上&#xff0c;并返回一個迭代器&#xff08;Python 3.x 中&#xff09;。 基本語法 map(function, iterable, ...)function: 應用于…

上海餐飲市場數據分析與可視化

上海作為中國的經濟中心和國際化大都市,其餐飲市場具有高度的多樣性和競爭性。隨著消費者需求的不斷變化,餐飲行業的從業者和投資者需要深入了解市場現狀和趨勢,以便制定更有效的商業策略。本文將通過數據分析和可視化技術,深入探討上海餐飲市場的現狀和趨勢,為餐飲從業者…

MySQL基礎 [五] - 表的增刪查改

目錄 Create&#xff08;insert&#xff09; Retrieve&#xff08;select&#xff09; where條件 ?編輯 NULL的查詢 結果排序(order by) 篩選分頁結果 (limit) Update Delete 刪除表 截斷表&#xff08;truncate&#xff09; 插入查詢結果&#xff08;insertselect&…

SQL:Primary Key(主鍵)和Foreign Key(外鍵)

目錄 1. Key&#xff08;鍵&#xff09; 2. Index&#xff08;索引&#xff09; 3.Key和Index的區別 4. Primary Key&#xff08;主鍵&#xff09; 5. Foreign Key&#xff08;外鍵&#xff09; 6.主鍵和外鍵的關系 溫馨提示&#xff1a; 閃電按鈕不同的執行功能 首先&…

2025年- H1-Lc109-160. 相交列表--java版

1.題目描述 2.思路 “雙指針切換鏈表頭” 思路一&#xff1a;雙指針路徑對齊 while (pA ! pB) { pA (pA null) ? headB : pA.next; pB (pB null) ? headA : pB.next; } 讓兩個指針走相同的總路徑長度&#xff01; 設&#xff1a; 鏈表 A 獨有部分長度是 lenA 鏈表 B …

PyTorch 深度學習 || 6. Transformer | Ch6.3 Transformer 簡單案例

1. 簡單案例 這個代碼是一個簡單的 Transformer 模型的實現,這個例子展示了一個基本的序列到序列(seq2seq)任務,比如將一個數字序列轉換為另一個數字序列。可以用于學習和理解 Transformer 的基本結構和工作原理。 import torch import torch.nn as nn import math# 位置…

基礎算法篇(4)(藍橋杯常考點)—數據結構(進階)

前言 這期將會講到基礎算法篇里面的數據結構&#xff08;進階&#xff09;&#xff0c;主要包括單調棧&#xff0c;單調隊列&#xff0c;并查集&#xff0c;擴展域并查集&#xff0c;帶權并查集&#xff0c;字符串哈希&#xff0c;Trie樹。 數據結構(進階&#xff09;正文 單…

【AI學習】初步了解Gradio

Gradio 是一個開源的 Python 庫&#xff0c;專注于快速構建交互式 Web 界面&#xff0c;特別適用于機器學習模型、數據科學項目或任意 Python 函數的演示與部署。它通過極簡的代碼實現前后端一體化&#xff0c;無需前端開發經驗即可創建功能豐富的應用。以下是 Gradio 的核心特…

Overleaf 論文提交 Arxiv

Contents References 清除 Overleaf 中所有編譯 error&#xff0c;并且保證 main.tex 文件在 project 最上層參考文件 .bib 轉 .bbl. project 編譯成功后可以在 Overleaf 的 Recompile 按鈕右側找到 “Logs and output files”&#xff0c;點進去之后右下角可以點開 “Other lo…

【Android Audio】Parameter Framework - pfw

Parameter Framework - Android AudioPolicy Engine 使用 libengineconfigurable.so 來取締默認安卓音頻引擎 libenginedefault.so&#xff0c;因為默認安卓音頻引擎是通過代碼來決定策略&#xff0c;然而 libengineconfigurable 采用讀取pfw類型的文件來實現音頻策略配置。 …

服務器虛擬化技術深度解析:醫藥流通行業IT架構優化指南

一、服務器虛擬化的定義與原理 &#xff08;一&#xff09;技術定義&#xff1a;從物理到虛擬的資源重構 服務器虛擬化是通過軟件層&#xff08;Hypervisor&#xff09;將物理服務器的CPU、內存、存儲、網絡等硬件資源抽象為邏輯資源池&#xff0c;分割成多個相互隔離的虛擬機…

babel-runtime 如何縮小打包體積

&#x1f916; 作者簡介&#xff1a;水煮白菜王&#xff0c;一位前端勸退師 &#x1f47b; &#x1f440; 文章專欄&#xff1a; 前端專欄 &#xff0c;記錄一下平時在博客寫作中&#xff0c;總結出的一些開發技巧和知識歸納總結?。 感謝支持&#x1f495;&#x1f495;&#…

劍指Offer(數據結構與算法面試題精講)C++版——day7

劍指Offer&#xff08;數據結構與算法面試題精講&#xff09;C版——day7 題目一&#xff1a;最多刪除一個字符得到回文題目二&#xff1a;回文子字符串的個數題目三&#xff1a;刪除倒數第k個節點 題目一&#xff1a;最多刪除一個字符得到回文 這里我們可以在經典的字符串回文…