黑馬Java面試筆記之MySQL篇(優化)

?一.?慢查詢

在MySQL中,如何定位慢查詢?

?出現慢查詢的情況有以下幾種:

  • 聚合查詢
  • 多表查詢
  • 表數據量過大查詢
  • 深度分頁查詢

表象:頁面加載過慢,接口壓測響應時間過長(超過1s)

1.2 如何定位慢查詢?

方案一:開源工具

  • 調試工具:Arthas
  • 運維工具:Prometheus、Skywalking

方案二:MySQL自帶慢日志

? ? ? ? 慢查詢日志記錄了所有執行時間超過指定參數(long_query_time,單位:秒,默認10秒)的所有SQL語句的日志,如果要開啟慢查詢日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

? ? ? ? 配置完畢之后,通過一下指令重新啟動MySQL服務器進行測試,查看慢日志文件中記錄的信息 /var/lib/mysql/localhost-slow.log。

總結

面試官:MySQL中,如何定義慢查詢?

候選人:嗯~,我們當時做壓測的時候有的接口非常的慢,接口的響應時間超過了2秒以上,因為我們當時的系統部署了運維的監控系統Skywalking,在展示的報表中可以看到是哪一個接口比較慢,并且可以分析這個接口哪部分比較慢,這里可以看到SQL的具體的執行時間,所以可以定位是哪個sql出了問題。

? ? ? ? 如果,項目中沒有這種運維的監控系統,其實在MySQL中也提供了慢日志查詢功能,可以在MySQL的系統配置文件中開啟這個慢日志的功能,并且也可以設置SQL執行超過多少時間來記錄到一個日志文件中,我記得上一個項目配置的是2秒,只要SQL執行的時間超過了2秒就會記錄到日志文件中,我們就可以在日志文件找到執行比較慢的SQL了。


二. SQL語句執行很慢,如何分析

那這個SQL語句執行很慢,如何分析呢?

2.1 分析

? ? ? ? ?可以采用WXPLAIN或者DESC命令獲取MySQL如何執行SELECT語句的信息

總結

面試官:那這個SQL語句執行很慢,如何分析呢?

候選人:如果一條sql執行很慢的話,我們通常會使用mysql自動的執行計劃explain來去查看這條sql的執行情況,比如在這里面可以通過key和key_len檢查是否命中了索引,如果本身已經添加了索引,也可以判斷是否有失效的情況,第二個,可以通過type字段查看sql是否有進一步的優化空間,是否存在全索引或全盤掃描,第三個可以通過extra建議來判斷,是否出現了回表的情況,如果出現了,可以嘗試添加索引或修改返回字段來修復


?三. 了解過索引嗎?(什么是索引)

了解過索引嗎?(什么是索引)

? ? ? ? ?索引(index)是幫助MySQL高效獲取數據的數據結構(有序)。在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構(B+樹),這些數據結構以某種方式引用(指向)數據,這樣就可以在這些數據上實現高級查找算法,這種數據結構就是索引。

索引的底層數據結構了解過嗎?

3.1 數據結構對比

? ? ? ? MySQL默認使用的索引底層數據結構是B+樹。再聊B+樹之前,先聊聊二叉樹和B樹

? ? ? ? B-Tree,B樹是一種多叉路衡查找樹,相對于二叉樹,B樹每個節點可以有多個分支,即多叉。以一顆最大度數(max-degree)為5(5階)的b-tree為例,那這個B樹每個節點最多存儲4個key

????????? B+Tree是在BTree基礎上的一種優化,使其更適合實現外存儲索引結構,InnoDB存儲引擎就是用B+Tree實現其索引結構

總結

四. 聚簇索引和非聚簇索引

什么是 聚簇索引和非聚簇索引?

什么是聚集索引,什么是二級索引(非聚集索引)

什么是回表

4.1?聚集索引,二級索引(非聚集索引)

4.2 回表查詢

總結

注意:如果面試官直接問什么是回表查詢,要先解釋一下聚集索引和二級索引


五. 覆蓋索引

5.1 覆蓋索引

? ? ? ? 查詢使用了索引,并且需要返回的列,在該索引中已經全部能夠找到。

?

5.2 MYSQL超大分頁處理

? ? ? ? 在數據量比較大時,如果進行limit分頁查詢,在查詢時,越往后,分頁查詢效率越低。

? ? ? ? 優化思路:一般分頁查詢時,通過創建覆蓋索引 能夠比較好的提高性能,可以通過覆蓋索引子查詢形式進行優化

總結


六. 索引創建原則

索引創建原則有哪些?

????????回答這個問題,首先要陳述一下自己在實際的工作中是怎么用的,比如用到了主鍵索引、唯一索引或者是根據業務創建的索引(復合索引)

  1. 針對于數據量較大,且查詢比較頻繁的表建立索引。? ? ? ? 單表超過10萬數據(增加用戶體驗)
  2. 針對于常作為查詢條件(where)、排序(order by)、分組(group by)操作的字段建立索引。
  3. 盡量選擇區分度高的列作為索引,盡量建立唯一索引,區分度越高,使用索引的效率越高。
  4. 如果是字符串類型的字段,字段的長度較長,可以針對于字段的特點,建立前綴索引。
  5. 盡量使用聯合索引,減少單列索引,查詢時,聯合索引很多時候可以覆蓋索引,節省存儲時間,避免回表,提高查詢效率
  6. 要控制索引的數量,所以并不是多多益善,索引越多,維護索引結構的代價也就越大,會影響增刪改的效率
  7. 如果索引不能存儲NULL值,請在創建表時使用NOT NULL約束它。當優化器知道每列是否包含NULL值時,它可以更好的確定哪個索引最有效的用于查詢

總結

七. 索引失效

在什么情況下,索引會失效?

????????索引失效的情況有很多,可以說一些自己遇到過的,不要張口就說一推背誦好的面試題(適當的思考一下,更真實)

1)違反最左前綴法則

?

?? ? ? ? 違反最左前綴法則,索引失效:

2)范圍查詢右邊的列,不能使用索引。

3)不要咋索引列上進行運算操作,索引將失效

4)字符串不加單引號,造成索引失效。

?5)以%開頭的Like模糊查詢,索引失效。如果僅僅是尾部模糊匹配,索引不會失效。如果是頭部模糊匹配,索引失效

?

總結

?

八. 談一談對sql優化的經驗

?談一談對sql優化的經驗

8.1 表的設計優化

? ? ? ? 參考阿里開發手冊《嵩山版》

8.2 索引優化

8.3 SQL語句優化

8.4 主從復制、讀寫分離

? ? ? ? 如果數據庫的使用場景讀的操作比較多的時候,為了避免寫的操作所造成的性能影響,可以采用讀寫分離的架構。讀寫分離解決的是,數據庫的寫入,影響了查詢的效率。

總結

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

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

相關文章

歷史數據分析——廣州港

個股簡介 公司簡介: 華南地區最大的綜合性主樞紐港。 本公司是由廣州港集團、國投交通、廣州發展作為發起人,共同出資以發起方式設立的股份有限公司。 經營分析: 一般經營項目:企業管理服務(涉及許可經營項目的除外);港務船舶調度服務;船舶通信服務;企業自有資金…

圖解gpt之Transformer架構與設計原理

Transformer架構。它不僅僅是一個模型,更是一種范式,徹底改變了我們理解和處理自然語言的方式。 2017年,谷歌大腦團隊發表了一篇劃時代的論文,題目就叫《Attention is All You Need》。這標題本身就充滿了力量,宣告了…

HCIP:MPLS靜態LSP的配置及抓包

目錄 一、MPLS的簡單的一些知識點 1.MPLS的概述: 2.MPLS工作原理: 3.MPLS的核心組件: 4. MPLS標簽 5.MPLS標簽的處理 6.MPLS轉發的概述: 7.MPLS的靜態LSP建立方式 二、MPLS的靜態LSP的實驗配置 1.配置接口的地址和配置OS…

Azure DevOps 管道部署系列之一本地服務器

Azure DevOps 是一個幫助改進 SDLC(軟件開發生命周期)的平臺。 在本文中,我們將使用 Azure Pipelines 創建自動化部署。 Azure DevOps 團隊將 Azure Pipelines 定義為“使用 CI/CD 構建、測試和部署,適用于任何語言、平臺和云平臺”。 在這里,我將解釋如何在 Azure Dev…

深入剖析網絡協議:七層協議與四層協議詳解

在計算機網絡的世界中,數據的傳輸與交互離不開協議的規范。其中,七層協議和四層協議是網絡通信架構的核心概念,它們如同網絡世界的 “交通規則”,保障著數據準確、高效地在不同設備間流轉。本文將深入解讀七層協議與四層協議&…

回頭看,FPGA+RK3576方案的功耗性能優勢

作者:Hello,Panda 各位朋友,大家好,熊貓君這次開個倒車,在這個廣泛使用Xilinx(Altera)高端SoC的時代,分享一個“FPGAARM”實現的低功耗高性能傳統方案。 圖1 瑞芯微RK3576電路 當前&#xff0c…

打造極致計算器:HTML+Tailwind+DaisyUI實戰

一、計算器總體描述 創建一個在線計算器來實現基礎數學運算功能,通過單一頁面集成數字按鈕、運算符按鈕和顯示結果區域,界面采用簡潔直觀的布局設計,按鈕排列合理且提供即時運算反饋,確保計算邏輯準確和良好的按鍵響應體驗&#x…

基于mediapipe深度學習的虛擬畫板系統python源碼

目錄 1.前言 2.算法運行效果圖預覽 3.算法運行軟件版本 4.部分核心程序 5.算法仿真參數 6.算法理論概述 7.參考文獻 8.算法完整程序工程 1.前言 虛擬畫板系統基于計算機視覺與深度學習技術,通過攝像頭捕獲用戶手部動作,利用 MediaPipe框架實現手…

開源的JT1078轉GB28181服務器

JT1078轉GB28181流程 項目地址: JT1078轉GB28181的流媒體服務器: https://github.com/lkmio/lkm JT1078轉GB28181的信令服務器: https://github.com/lkmio/gb-cms 1. 創建GB28181 UA 調用接口: http://localhost:9000/api/v1/jt/device/add 請求體如下&#xf…

元器件基礎學習筆記——雙極結型晶體管 (BJT)

一、概述 1.1 基本結構 雙極結型晶體管(Bipolar Junction Transistor)由發射極(Emitter)、基極(Base)和集電極(Collector)三個摻雜程度不同的半導體區域組成,分別對應有…

Python 在金融中的應用- Part 1

早在2018年,我開始對資本市場產生興趣。理解資本市場的基本理論對財富積累至關重要。我開始閱讀所有經典著作,如《聰明的投資者》和《證券分析》。在這一系列文章中,我想與讀者分享在Python編程語言背景下理解金融理論的旅程。在文章的第一大部分,我們將專注于金融模型的線…

css使用scoped之后樣式失效問題

項目中的vue代碼原本用的style標簽來寫css&#xff0c;現在想改成<style langscss scoped>&#xff0c;但是改完之后發現樣式不對&#xff1a; 原來是&#xff1a; 將style改成scoped之后變成了&#xff1a;檢查發現是之前定義的一些變量無法被識別&#xff0c;導致這些樣…

基于 GitLab CI + Inno Setup 實現 Windows 程序自動化打包發布方案

在 Windows 桌面應用開發中&#xff0c;實現自動化構建與打包發布是一項非常實用的工程實踐。本文以我在開發PackTes項目時的為例&#xff0c;介紹如何通過 GitLab CI 配合 Inno Setup、批處理腳本、Qt 構建工具&#xff0c;實現版本化打包并發布到共享目錄的完整流程。 項目地…

能源領域新興技術論壇:EMQ 實時數據引擎構建工業智能中樞

5 月 26 日&#xff0c;由沙特阿美亞洲公司主辦的能源領域新興技術論壇在上海順利舉行。本次論壇聚焦智能工廠、無人機與機器人、可靠性與完整性、先進材料四大技術賽道&#xff0c;吸引了來自全球的能源企業、技術供應商及行業專家。 作為業內知名的 MQ AI 實時數據與智能產…

【計算機網絡】第2章:應用層—DNS

目錄 一、PPT 二、總結 DNS&#xff08;域名系統&#xff09;詳解 &#xff08;一&#xff09;DNS核心概念 &#xff08;二&#xff09;DNS查詢過程&#xff08;重點?&#xff09; &#xff08;三&#xff09;DNS資源記錄&#xff08;RR&#xff09;類型…

PHP HTTP 完全指南

PHP HTTP 完全指南 引言 PHP 作為一種流行的服務器端腳本語言,廣泛應用于各種Web開發項目中。HTTP(超文本傳輸協議)是互聯網上應用最為廣泛的網絡協議之一,用于在Web服務器和客戶端之間傳輸數據。本文將詳細介紹 PHP 在 HTTP 通信中的應用,幫助開發者更好地理解和利用 P…

C++測開,自動化測試,業務(第一段實習)

目錄 &#x1f33c;前言 一&#xff0c;實習經歷怎么寫簡歷 &#x1f339;業務理解 &#x1f382;結構化表達 二&#xff0c;實習 &#x1f982;技術和流程卡點 &#x1f511;實習收獲 / 代碼風格 三&#xff0c;測試理論&#xff0c;用例設計&#xff0c;工具鏈 &…

NodeJS全棧開發面試題講解——P5前端能力(React/Vue + API調用)

? 5.1 如何使用 React/Vue 發起后端請求&#xff1f;用什么庫&#xff1f; 面試官您好&#xff0c;在實際項目中我們通常使用 axios、fetch 或框架提供的封裝庫發起后端請求。 &#x1f527; 常用庫對比&#xff1a; 庫框架適配優點axios通用默認支持攔截器、取消請求、請求體…

【C/C++】cmake實現Release版本禁用調試接口技巧

在 C 中通過 CMake 實現部分接口在 Release 版本不生效&#xff0c;可以通過條件編譯結合 CMake 的構建類型判斷來實現。以下是詳細步驟&#xff1a; 1. 在 CMakeLists.txt 中定義配置相關宏 # 設置構建類型&#xff08;可選&#xff0c;但推薦顯式設置&#xff09; if(NOT C…

Spring Boot中的WebSocket技術實現

WebSocket協議基礎 WebSocket作為現代實時通信的核心技術,通過全雙工TCP通道實現了接近實時的數據傳輸能力。該協議主要包含以下核心特性: 協議特點與通信機制 全雙工通信:與HTTP等傳統協議不同,WebSocket允許客戶端和服務端同時發送和接收數據,消除了請求-響應模式的限…