Mysql面試合集

概念

是一個開源的關系型數據庫。

數據庫事務及其特性

事務:是一系列的數據庫操作,是數據庫應用的基本邏輯單位。

事務特性:

(1)原子性:即不可分割性,事務要么全部被執行,要么就全部不被執行。

(2)一致性。事務的執行使得數據庫從一種正確狀態轉換成另一種正確狀態

(3)隔離性。在事務正確提交之前,不允許把該事務對數據的任何改變提供給任何其他事務,

(4) 持久性。事務正確提交后,其結果將永久保存在數據庫中,即使在事務提交后有了其他故障,事務的處理結果也會得到保存。

數據庫三范式

第一范式(1NF)無重復的列(原子性)

第二范式(2NF)屬性完全依賴于主鍵

第三范式(3NF)屬性不依賴于其它非主屬性

sql語句在mysql中的執行過程

客戶端發起sql請求,與MySQL服務器建立連接,如果是select會先查詢緩存(mysql8刪除),沒有命中緩存進入分析器,解析處理,更新前記錄下log,用于事務回滾。然后判斷記錄是否存在緩沖池中,查詢存在直接返回,更新存在判斷存在沖突。最后提交事務。

常見優化方式

a. 設計良好的數據庫結構,允許部分數據冗余,盡量避免join查詢,提高效率。
b. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。
c. mysql庫主從讀寫分離。
d. 找規律分表,減少單表中的數據量提高查詢速度。
e. 添加緩存機制,比如memcached,apc等。
f. 不經常改動的頁面,生成靜態頁面。
g. 書寫高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.

mysql事務隔離級別

1、串行讀 (Serializable)

2、可重復讀 (RR默認)

確保同一事務的多個實例并發讀取數據時,會看到同樣的數據行,解決了不可重復讀的問題。

3、讀已提交 (RC)

一個事務只能看見已經提交事務所做的改變。可避免臟讀的發生。

4、讀未提交 (Read uncommitted)

所有事務都可以看到其他未提交事務的執行結果。

臟讀:讀到了臟數據,即無效數據。
不可重復讀:是指在數據庫訪問中,一個事務內的多次相同查詢卻返回了不同數據。
幻讀:指同一個事務內多次查詢返回的結果集不一樣,比如增加了行記錄。
  • 臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。
  • 不可重復讀是指在對于數據庫中的某行記錄,一個事務范圍內多次查詢卻返回了不同的數據值,這是由于在查詢間隔,另一個事務修改了數據并提交了。
  • 幻讀是當某個事務在讀取某個范圍內的記錄時,另外一個事務又在該范圍內插入了新的記錄。對幻讀的正確理解是一個事務內的讀取操作的結論不能支撐之后業務的執行。假設事務要新增一條記錄,主鍵為id,在新增之前執行了select,沒有發現id為xxx的記錄,但插入時出現主鍵沖突,這就屬于幻讀,讀取不到記錄卻發現主鍵沖突是因為記錄實際上已經被其他的事務插入了,但當前事務不可見。
  • 不可重復讀和臟讀的區別是,臟讀是某一事務讀取了另一個事務未提交的臟數據,而不可重復讀則是讀取了前一事務提交的數據。

innodb和myisam的區別?

InnoDB支持行鎖、事務處理、外鍵、安全恢復,MyISAM不支持

InnoDB必須有主鍵,MyISAM可以沒有

建立索引需要考慮什么?

1、選擇合適的字段建立索引

根據查詢頻率(如姓名、日期),設置索引。字段大量重復、為空不適合建立索引。
盡量找那種占用空間小的類型字段做索引,長字符串可以使用前綴索引,減少索引大小,提高查詢速度。

2、多個經常查詢列可以建立聯合索引

遵循向左原則。

3、避免過度索引和頻繁更新索引字段

占用磁盤空間、需要頻繁維護字段,浪費性能。

4、SQL優化慢查詢

//使用 show processlist
//觀察是否有大量線程處于不正常的狀態或者特征//使用 explain(desc) 分析單條SQL語句

一般做到range,極好做到ref,ALL全表掃描不推薦

image.png

如何MySQL和ES一致性?

1、操作MYSQL時同步操作ES,這種不推薦,因為重試邏輯嵌在業務代碼中,服務宕機,寫入失敗會一直重試。

2、通過binlog進行同步,客戶端從canal拉取消息進行消費,再由客戶端主動插入或者更新ES中的數據。也可以cannal發送binlog消息到消息隊列,client異步消費kafka中的消息。

b+樹是如何實現的 優勢在哪

B樹也稱B-樹,它是一顆多路平衡查找樹,B樹和后面講到的B+樹也是從最簡單的二叉樹變換而來的,并沒有什么神秘的地方,下面我們來看看B樹的定義。

  • 每個節點中的關鍵字都按照從小到大的順序排列,每個關鍵字的左子樹中的所有關鍵字都小于它,而右子樹中的所有關鍵字都大于它。
  • 所有葉子節點都位于同一層,或者說根節點到每個葉子節點的長度都相同。
  • 每個節點都存有索引和數據,也就是對應的key和value。

B樹和B+樹的區別在于,B+樹的非葉子結點只包含導航信息,不包含實際的值,每個葉子結點都存有相鄰葉子結點的指針葉子結點本身依關鍵字的大小自小而大順序鏈接,便于區間查找和遍歷。

  • 由于B+樹在內部節點上不包含數據信息,因此在內存頁中能夠存放更多的key。 數據存放的更加緊密,具有更好的空間局部性。因此訪問葉子節點上關聯的數據也具有更好的緩存命中率。
  • B+樹的葉子結點都是相鏈的,因此對整棵樹的便利只需要一次線性遍歷葉子結點即可。而且由于數據順序排列并且相連,所以便于區間查找和搜索。而B樹則需要進行每一層的遞歸遍歷。相鄰的元素可能在內存中不相鄰,所以緩存命中性沒有B+樹好。

MySQL悲觀鎖

在查詢庫存時加排它鎖,阻止其他事務對這條數據進行加鎖或者修改

優點:MySQL事物鎖準確度高。缺點:耗性能,對MySQL壓力較大。

DB::beginTransaction();try {$stock = Skill::query()->where('id', $id)->lockForUpdate()->value('stock');if ($stock > 0) {Skill::query()->where('id', $id)->decrement('stock');echo '搶購成功';} else {echo '庫存不足,搶購失敗';}DB::commit();} catch (\Exception $e) {echo $e->getMessage();DB::rollBack();}

MySQL樂觀鎖

不加鎖實現鎖效果,MySQL樂觀鎖就是MVCC機制,借助version版本號進行控制

優點:因為不涉及鎖數據,并發量比悲觀鎖。缺點:MySQL抗壓瓶頸。

$info = Skill::query()->where('id', $id)->first(['stock', 'version']);
if ($info->stock > 0) {$skill = Skill::query()->where(['id' => $id, 'version' => $info->version])->update(['stock' => $info->stock -1, 'version' => $info->version + 1]);echo '搶購成功';
} else {echo '庫存不足,搶購失敗';
}

MVCC:多版本并發控制。在MySQL InnoDB 中的實現主要是為了提高數據庫并發性能,用更好的方式去處理讀-寫沖突,做到即使有讀寫沖突時,也能做到不加鎖,非阻塞并發讀。

當前讀:讀取的是記錄的最新版本,讀取時會保證其他并發事務不能修改當前記錄,會對讀取的記錄進行加鎖。

快照讀:不加鎖的非阻塞讀。

持續更新,未完待續~

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

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

相關文章

代碼隨想錄1數組

1 二分查找 Leetcode704 1 [l,r]區間 l 0, r nums.length-1; while(l<r) 因為lr有意義 2 [l,r)區間 l 0, r nums.length; while(l<r) Leetcode35 class Solution {public int searchInsert(int[] nums, int target) {int l0,rnums.length;while(l<r){int m l(…

使用設計模式來增強你的 SpringBoot 開發

SpringBoot 是一個出色的框架&#xff0c;可以快速構建強大而高效的應用程序。但你是否知道設計模式可以將 SpringBoot 開發提升到一個新的水平&#xff1f; ? 設計模式的重要性&#xff1a;了解設計模式如何促進代碼的可重用性、可維護性和整體應用程序健康。 ? SpringBoot…

在Spring Data JPA中使用@Query注解

目錄 前言示例簡單示例只查詢部分字段&#xff0c;映射到一個實體類中只查詢部分字段時&#xff0c;也可以使用List<Object[]>接收返回值再復雜一些 前言 在以往寫過幾篇spring data jpa相關的文章&#xff0c;分別是 Spring Data JPA 使用JpaSpecificationExecutor實現…

python 筆試面試八股(自用版~)

1 解釋型和編譯型語言的區別 解釋是翻譯一句執行一句&#xff0c;更靈活&#xff0c;eg&#xff1a;python; 解釋成機器能理解的指令&#xff0c;而不是二進制碼 編譯是整個源程序編譯成機器可以直接執行的二進制可運行的程序&#xff0c;再運行這個程序 比如c 2 簡述下 Pyth…

運維鍋總詳解RocketMQ

本文嘗試從Apache RocketMQ的簡介、主要組件及其作用、3種部署模式、Controller集群模式工作流程、最佳實踐等方面對其進行詳細分析。希望對您有所幫助&#xff01; 一、Apache RocketMQ 簡介 Apache RocketMQ 是一個開源的分布式消息中間件&#xff0c;由阿里巴巴集團開發并…

祝賀《華為戰略管理法:DSTE實戰體系》被《中國企業家》雜志評為企業家枕邊書50本之一(宏觀戰略類書籍)

祝賀《華為戰略管理法&#xff1a;DSTE實戰體系》被《中國企業家》雜志評為企業家枕邊書50本之一 2024年4月23日&#xff08;周二&#xff09;下午13:00&#xff0c;《中國企業家》雜志如期舉辦“每天都是讀書日”線下活動。 《中國企業家》雜志攜手商界大咖共同推選50本枕邊書…

Vue.js中的計算屬性

Vue.js中的計算屬性&#xff08;computed properties&#xff09;是用于聲明響應式依賴的屬性。它們會根據它們的依賴進行緩存&#xff0c;并且只有在相關依賴發生改變時才會重新求值。這使得它們非常適合用來處理復雜邏輯和數據處理。 基本用法 在Vue實例中&#xff0c;可以…

鐳速實現AD域集成助力企業文件安全傳輸管控

在當今這個信息量爆炸擴張的年代&#xff0c;企業數據宛如一座蘊藏無限價值的寶庫&#xff0c;它不僅是企業核心競爭力的載體&#xff0c;也成為了各種潛在風險的聚焦點。隨著數字化轉型步伐的加快&#xff0c;安全文件傳輸的管理控制顯得尤為重要&#xff0c;它構成了保護企業…

各類排序方法 歸并排序 擴展練習 逆序對數量

七月挑戰一個月重刷完Y總算法基礎題&#xff0c;并且每道題寫詳細題解 進度:(3/106) 歸并排序的思想也是分而治之 歸并優點&#xff1a;速度穩定,排序也穩定 排序也穩定&#xff08;數組中有兩個一樣的值&#xff0c;排序之后他們的前后順序不發生變化&#xff0c;我們就說…

Leetcode 2065. 最大化一張圖中的路徑價值(DFS / 最短路)

Leetcode 2065. 最大化一張圖中的路徑價值 暴力DFS 容易想到&#xff0c;從0點出發DFS&#xff0c;期間維護已經走過的距離&#xff08;時間&#xff09;和途徑點的權值之和&#xff0c;若訪問到0點則更新答案&#xff0c;若下一步的距離與已走過的距離和超出了maxTime&#…

oracle sql語句 排序 fjd = ‘0101‘ 排在 fjd = ‘0103‘ 的前面

要實現這個排序需求&#xff0c;你可以使用 CASE 表達式來自定義排序邏輯。假設你有一個表格名為 your_table&#xff0c;并且有一個字段 fjd 存儲類似 ‘0101’, ‘0103’ 這樣的值&#xff0c;你可以這樣編寫 SQL 查詢&#xff1a; SELECT * FROM your_table ORDER BY CASE …

專題六:Spring源碼之初始化容器BeanFactory

上一篇咱們通過一個例子介紹初始化容器上下文相關內容&#xff0c;并通過兩個示例代碼看到了Spring在設計階段為我預留的擴展點&#xff0c;和我們應該如何利用這兩個擴展點在Spring初始化容器上下文階段為我們提供服務。這一篇咱們接著往下看。 老這樣子下回到refresh方法上來…

第55期:MySQL 頻繁 Crash 怎么辦?

社區王牌專欄《一問一實驗&#xff1a;AI 版》全新改版歸來&#xff0c;得到了新老讀者們的關注。其中不乏對 ChatDBA 感興趣的讀者前來咨詢&#xff0c;表達了想試用體驗 ChatDBA 的意愿&#xff0c;對此我們表示感謝 &#x1f91f;。 目前&#xff0c;ChatDBA 還在最后的準備…

MSVCR120.DLL丟失的多種修復方法,助你快速解決dll問題

在日常生活和工作中&#xff0c;電腦已經成為我們不可或缺的工具。然而&#xff0c;在使用電腦的過程中&#xff0c;我們常常會遇到一些問題&#xff0c;其中之一就是電腦運行軟件時提示找不到msvcr120.dll。如果該文件缺失或損壞&#xff0c;可能會導致依賴它的應用程序無法啟…

高優先線程

你開發的時候有么有遇到過一個問題&#xff1a;服務器的一個服務線程過幾個小時斷連一次&#xff0c;斷連之后會馬上重連這種情況。這是由于CPU負載較高,線程調度時將處理數據的線程掛起了一段時間導致的。 因此&#xff0c;我有考慮到把cpu的核心進行分散開來&#xff0c;就類…

CesiumJS【Basic】- #042 繪制紋理線(Primitive方式)

文章目錄 繪制紋理線(Primitive方式)1 目標2 代碼2.1 main.ts3 資源文件繪制紋理線(Primitive方式) 1 目標 使用Primitive方式繪制紋理線 2 代碼 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);var

【劍指Offer系列】68-二叉樹的最近公共祖先(哈希)

思路&#xff1a;使用map存儲每個節點的父節點&#xff0c;則兩個節點的最近公共祖先&#xff0c;即二者的最近父節點 1、中序遍歷二叉樹&#xff08;當前節點的下一個節點&#xff09; 2、記錄每個節點的父節點 3、列出p的族譜、q的族譜 4、尋找二者最近的祖先 class Soluti…

微信小程序畢業設計-英語互助系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…

PS系統教程31

調色之色階 調色與通道最基本的關系通道是記錄顏色最基本的信息有些圖片可以用通道去改變顏色信息的說明這些圖像是比較高級的PS是一款圖像合成軟件&#xff0c;在合成過程中需要處理大量素材&#xff0c;比如要用這些素材進行摳背景&#xff0c;就要用到圖層蒙版以及Alpha通道…

Qt編程技巧總結篇(2)-信號-槽-多線程(一)

文章目錄 Qt編程技巧總結篇&#xff08;2&#xff09;-信號-槽-多線程&#xff08;一&#xff09;信號與槽實例與應用 小結 Qt編程技巧總結篇&#xff08;2&#xff09;-信號-槽-多線程&#xff08;一&#xff09; 最近學習信號與槽以及多線程&#xff0c;非常有技術含量&#…