【面試專題】MySQL篇①

1.MySQL中,如何定位慢查詢?

①介紹一下當時產生問題的場景(我們當時的一個接口測試的時候非常的慢,壓測的結果大概5秒鐘)

②我們系統中當時采用了運維工具( Skywalking ),可以監測出哪個接口,最終因為是sql的問題

③在mysql中開啟了慢日志查詢,我們設置的值就是2秒,一旦sql執行超過2秒就會記錄到日志中(調試階段)

面試回答:

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

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

擴展:

方案一:開源工具

調試工具:Arthas

運維工具:Prometheus 、Skywalking

以Skywalking為例:

方案二:MySQL自帶慢日志

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

SHOW VARIABLES LIKE 'slow_query_log';

我的之前配置過,所以顯示的是ON(off為關,on為開):?

SHOW VARIABLES LIKE 'long_query_time';
# 設置慢日志的時間為2秒,SQL語句執行時間超過2秒,就會視為慢查詢,記錄慢查詢日志
long_query_time=2

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

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

面試回答:

如果一條sql執行很慢的話,我們通常會使用mysql自動的執行計劃explain來去查看這條sql的執行情況。

①可以通過key和key_len檢查是否命中了索引,如果本身已經添加了索引,也可以判斷索引是否有失效的情況

②可以通過type字段查看sql是否有進一步的優化空間,是否存在全索引掃描或全盤掃描

③可以通過extra建議來判斷,是否出現了回表的情況,如果出現了,可以嘗試添加索引或修改返回字段來修復

擴展:

-- 直接在select語句之前加上關鍵字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 條件 ;

?

Explain?執行計劃中各個字段的含義:

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

面試回答:

索引在項目中還是比較常見的,它是幫助MySQL高效獲取數據的數據結構,主要是用來提高數據檢索的效率,降低數據庫的IO成本,同時通過索引列對數據進行排序,降低數據排序的成本,也能降低了CPU的消耗。

擴展:

【MySQL進階】索引的結構及分類_mysql索引數據結構有哪些-CSDN博客

?

4.索引的底層數據結構了解過嘛?

面試回答:

MySQL的默認的存儲引擎InnoDB采用的B+樹的數據結構來存儲索引,選擇B+樹的主要的原因是:

①階數更多,路徑更短

②磁盤讀寫代價B+樹更低,非葉子節點只存儲指針,葉子階段存儲數據

③B+樹便于掃庫和區間查詢,葉子節點是一個雙向鏈表

?擴展:

【MySQL進階】索引的結構及分類_mysql索引數據結構有哪些-CSDN博客

5.B樹和B+樹的區別是什么呢?

面試回答:

第一:在B樹中,非葉子節點和葉子節點都會存放數據,而B+樹的所有的數據都會出現在葉子節點,在查詢的時候,B+樹查找效率更加穩定

第二:在進行范圍查詢的時候,B+樹效率更高,因為B+樹都在葉子節點存儲,并且葉子節點是一個雙向鏈表

?擴展:

【MySQL進階】索引的結構及分類_mysql索引數據結構有哪些-CSDN博客

6.InnoDB為什么使用B+樹實現索引?

面試回答:

首先看看B+樹有哪些特點:

  1. B+樹是一棵平衡樹,每個葉子節點到根節點的路徑長度相同,查找效率較高;
  2. B+樹的所有關鍵字都在葉子節點上,因此范圍查詢時只需要遍歷一遍葉子節點即可;
  3. B+樹的葉子節點都按照關鍵字大小順序存放,因此可以快速地支持按照關鍵字大小進行排序;
  4. B+樹的非葉子節點不存儲實際數據,因此可以存儲更多的索引數據;
  5. B+樹的非葉子節點使用指針連接子節點,因此可以快速地支持范圍查詢和倒序查詢。
  6. B+樹的葉子節點之間通過雙向鏈表鏈接,方便進行范圍查詢。

?

那么,使用B+樹實現索引,就有以下幾個優點:

  1. 支持范圍查詢,B+樹在進行范圍查找時,只需要從根節點一直遍歷到葉子節點,因為數據都存儲在葉子節點上,而且葉子節點之間有指針連接,可以很方便地進行范圍查找。
  2. 支持排序,B+樹的葉子節點按照關鍵字順序存儲,可以快速支持排序操作,提高排序效率;
  3. 存儲更多的索引數據,因為它的非葉子節點只存儲索引關鍵字,不存儲實際數據,因此可以存儲更多的索引數據;
  4. 在節點分裂和合并時,IO操作少。B+樹的葉子節點的大小是固定的,而且節點的大小一般都會設置為一頁的大小,這就使得節點分裂和合并時,IO操作很少,只需讀取和寫入一頁。
  5. 有利于磁盤預讀。由于B+樹的節點大小是固定的,因此可以很好地利用磁盤預讀特性,一次性讀取多個節點到內存中,這樣可以減少IO操作次數,提高查詢效率。
  6. 有利于緩存。B+樹的非葉子節點只存儲指向子節點的指針,而不存儲數據,這樣可以使得緩存能夠容納更多的索引數據,從而提高緩存的命中率,加快查詢速度。

?

7.什么是聚簇索引什么是非聚簇索引 ?

面試回答:

聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)是數據庫中的兩種索引類型,它們在組織和存儲數據時有不同的方式。

聚簇索引簡單點理解就是將數據與索引放到了一起,找到索引也就找到了數據。也就是說,對于聚簇索引來說,他的非葉子節點上存儲的是索引字段的值,而他的葉子節點上存儲的是這條記錄的整行數據。

非聚簇索引就是將數據與索引分開存儲,葉子節點包含索引字段值及指向數據頁數據行的邏輯指針。

  • 對于聚簇索引來說,他的非葉子節點上存儲的是索引值,而它的葉子節點上存儲的是整行記錄。
  • 對于非聚簇索引來說,他的非葉子節點上存儲的都是索引值,而它的葉子節點上存儲的是主鍵的值。

所以,通過非聚簇索引的查詢,需要進行一次回表,就是先查到主鍵ID,在通過ID查詢所需字段。

?擴展:

聚集索引選取規則:

如果存在主鍵,主鍵索引就是聚集索引。

如果不存在主鍵,將使用第一個唯一(UNIQUE)索引作為聚集索引。

如果表沒有主鍵,或沒有合適的唯一索引,則InnoDB會自動生成一個rowid作為隱藏的聚集索引。

8.知道什么是回表查詢嗎?

在 InnoDB 里,索引B+ Tree的葉子節點存儲了整行數據的是主鍵索引,也被稱之為聚簇索引。而索引B+ Tree的葉子節點存儲了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引。

在存儲的數據方面,主鍵(聚簇)索引的B+樹的葉子節點直接就是我們要查詢的整行數據了。而非主鍵(非聚簇)索引的葉子節點是主鍵的值。

那么,當我們根據非聚簇索引查詢的時候,會先通過非聚簇索引查到主鍵的值,之后,還需要再通過主鍵的值再進行一次查詢才能得到我們要查詢的數據。而這個過程就叫做回表。

所以,在InnoDB 中,使用主鍵查詢的時候,是效率更高的, 因為這個過程不需要回表。另外,依賴覆蓋索引索引下推等技術,我們也可以通過優化索引結構以及SQL語句減少回表的次數。

9.知道什么叫覆蓋索引嘛 ?

覆蓋索引是指select查詢語句使用了索引,在返回的列,必須在索引中全部能夠找到,如果我們使用id查詢,它會直接走聚集索引查詢,一次索引掃描,直接返回數據,性能高。

如果按照二級索引查詢數據的時候,返回的列中沒有創建索引,有可能會觸發回表查詢,盡量避免使用select *,盡量在返回的列中都包含添加索引的字段

當一條查詢語句符合覆蓋索引條件時,MySQL只需要通過索引就可以返回查詢所需要的數據,這樣避免了查到索引后再返回表操作,減少I/O提高效率。

10.MySQL超大分頁怎么處理 ?

超大分頁一般都是在數據量比較大時,我們使用了limit分頁查詢,并且需要對數據進行排序,這個時候效率就很低,我們可以采用覆蓋索引和子查詢來解決

先分頁查詢數據的id字段,確定了id之后,再用子查詢來過濾,只查詢這個id列表中的數據就可以了

因為查詢id的時候,走的覆蓋索引,所以效率可以提升很多

?擴展:

我們一起來看看執行limit分頁查詢耗時對比:

因為,當在進行分頁查詢時,如果執行 limit 9000000,10 ,此時需要MySQL排序前9000010 記錄,僅僅返回 9000000 - 9000010 的記錄,其他記錄丟棄,查詢排序的代價非常大 。

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

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

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

相關文章

PostgreSQL從小白到高手教程 - 第38講:數據庫備份

PostgreSQL從小白到專家,是從入門逐漸能力提升的一個系列教程,內容包括對PG基礎的認知、包括安裝使用、包括角色權限、包括維護管理、、等內容,希望對熱愛PG、學習PG的同學們有幫助,歡迎持續關注CUUG PG技術大講堂。 第38講&#…

running小程序重要技術流程文檔

一、項目文件說明: (注:getMyMoney無用已刪除) 二、重要文件介紹 1.reinfo.js:位于utils文件下,該文件封裝有統一的請求URL,和請求API同意封裝供頁面調用;調用時候需要在頁面上先…

【C語言】操作符詳解(一):進制轉換,原碼,反碼,補碼

目錄 操作符分類 2進制和進制轉換 2進制轉10進制 10進制轉2進制 2進制轉8進制和16進制 2進制轉8進制 2進制轉16進制 原碼、反碼、補碼 操作符分類 操作符中有一些操作符和二進制有關系,我們先鋪墊一下二進制的和進制轉換的知識。 2進制和進制轉換 其實我們經…

數據結構準備知識

struct(結構體) struct,或稱為結構體,是C語言中一種復合數據類型,它允許你將多個不同類型的數據項組合成一個單一的單位。這對于創建記錄或更復雜的數據結構非常有用。 結構體的定義語法如下: struct 結…

vertica主鍵列能插入重復值的處理辦法

問題描述 開發同事反饋在vertica中創建含主鍵列的表中插入重復數據時沒有進行校驗,插入重復值成功。經過測試著實可以插入重復值,這個坑有些不一樣。 創建表和插入語句如下: --創建表 CREATE TABLE dhhtest(ID VARCHAR(64) PRIMARY KEY );…

postgresql數據庫配置主從并配置ssl加密

1、先將postgresql數據庫主從配置好 參考:postgresql主從配置 2、在主節點配置ssl加密,使用navicat測試是否可以連接 參考:postgresql配置ssl 3、正常連接無誤后,將root.crt、server.crt、server.key復制到從數據庫節點的存儲…

使用Microsoft Dynamics AX 2012 - 5. 生產控制

生產控制的主要職責是生產成品。為了完成這項任務,制造業需要消耗物品和資源能力(人員和機械)。制造過程可能包括半成品的生產和庫存。半成品是指物品包括在成品材料清單中。 制造業的業務流程 根據公司的要求,您可以選擇申請Dy…

某馬點評——day04

達人探店 發布探店筆記 改一下&#xff0c;圖片保存路徑就可以直接運行測試了。 查看探店筆記 Service public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {Resourceprivate IUserService userService;Overridepublic Resu…

OpenCL學習筆記(二)手動編譯開發庫(win10+vs2019)

前言 有時需求比較特別&#xff0c;可能需要重新編譯opencl的sdk庫。本文檔簡單記錄下win10下&#xff0c;使用vs2019編譯的過程&#xff0c;有需要的小伙伴可以參考下 一、獲取源碼 項目地址&#xff1a;GitHub - KhronosGroup/OpenCL-SDK: OpenCL SDK 可以直接使用git命令…

一篇文章了解指針變量

字符指針變量 在指針的類型中我們知道有一種指針叫做字符指針 它的使用情況如下&#xff1a; #include<stdio.h> int main() {char pa w;char*p1&pa;*p1 a;printf("%c\n", *p1);return 0; } 在這段代碼當中&#xff0c;我們將‘w’字符的地址傳到了p…

vue3 自己寫一個月的日歷

效果圖 代碼 <template><div class"monthPage"><div class"calendar" v-loading"loading"><!-- 星期 --><div class"weekBox"><div v-for"(item, index) in dayArr" :key"index&q…

2.修改列名與列的數據類型

修改字段名與字段數據類型 1.修改字段名 有時&#xff0c;在我們建好一張表后會突然發現&#xff0c;哎呀&#xff01;字段名貌似寫錯了&#xff01;怎么辦&#xff1f;要刪了表再重新建一個新表嗎&#xff1f;還是要刪了這個字段再新建一個新的字段&#xff1f; 都不用&…

AIGC專題報告:生成式人工智能人人可用的新時代

今天分享的AIGC系列深度研究報告&#xff1a;《AIGC專題報告&#xff1a;生成式人工智能人人可用的新時代》。 &#xff08;報告出品方&#xff1a;埃森哲&#xff09; 報告共計&#xff1a;21頁 人工智能發展迎來新拐點 ChatGPT 正在喚醒全球對人工智能&#xff08;AI&…

蛇形矩陣

蛇形矩陣是由1開始的自然數依次排列成的一個矩陣上三角形。 例如&#xff0c;當輸入5時&#xff0c;應該輸出的三角形為&#xff1a; 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 輸入描述&#xff1a;輸入正整數N&#xff08;N不大于100&#xff09; 輸出描述&#xff1a;輸出一個N…

MySQL七 | 存儲引擎

目錄 存儲引擎 存儲引擎特點 存儲引擎選擇 Innodb與MyISAM區別 存儲引擎 默認存儲引擎:InnoDB show engines;#展示當前數據庫支持的存儲引擎 存儲引擎特點 特點InnoDBMyISAMMemory存儲限制64TB有有事務安全支持--鎖機制行鎖表鎖表鎖Btree鎖支持支持 支持 Hash索引--支…

在pom.xml中添加maven依賴,但是類里面import導入的時候報錯

問題&#xff1a; Error:(27, 8) java: 類TestKuDo是公共的, 應在名為 TestKuDo.java 的文件中聲明 Error:(7, 23) java: 程序包org.apache.kudu不存在 Error:(8, 23) java: 程序包org.apache.kudu不存在 Error:(9, 23) java: 程序包org.apache.kudu不存在 Error:(10, 30) jav…

【場景測試用例】上傳文件

測試思路&#xff1a; 功能 上傳符合需求給的文件格式&#xff0c;大小&#xff0c;寬高等可以正常上傳 不同的文件格式最大/最小/中間的文件大小如支持批量上傳可以正常上傳 邊界值如支持刪除可以正常刪除指定文件&#xff0c;其他文件不受影響如支持預覽&#xff0c;可以正常…

【Java探索之旅】我與Java的初相識(一):Java的特性與優點及其發展史

&#x1f3a5; 嶼小夏 &#xff1a; 個人主頁 &#x1f525;個人專欄 &#xff1a; Java入門到精通 &#x1f304; 莫道桑榆晚&#xff0c;為霞尚滿天&#xff01; 文章目錄 一. Java語言概述與優勢1.1 Java的概述1.2 Java語言的優勢 二. Java領域與發展史2.1 Java的使用領域2.…

面試多線程八股文十問十答第二期

面試多線程八股文十問十答第二期 作者&#xff1a;程序員小白條&#xff0c;個人博客 相信看了本文后&#xff0c;對你的面試是有一定幫助的&#xff01; ?點贊?收藏?不迷路&#xff01;? 1.進程和線程的區別 概念不同&#xff1a;進程是操作系統中的一個獨立執行單元&a…

LeetCode56. Merge Intervals

文章目錄 一、題目二、題解 一、題目 Given an array of intervals where intervals[i] [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input. Example 1: Input: interva…