天天看點

精心整理的MYSQL面試題

PHP面試題 https://blog.csdn.net/hzbskak/article/details/120852249
REDIS面試題 https://blog.csdn.net/hzbskak/article/details/120852279
MYSQL面試題 https://blog.csdn.net/hzbskak/article/details/120852285
NGINX面試題 https://blog.csdn.net/hzbskak/article/details/120852271

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

索引哪些情況下會失效

  • 查詢條件包含or 會導緻索引失效
  • 組合索引中,查詢時要按照最左原則進行where條件判斷
  • like中 "%asdg"會導緻索引失效
  • 對索引進行函數操作或加減會導緻索引失效
  • *索引中使用!= 或者 not in 會失效
  • *隐式轉換也會失效 比如字段是int 卻用where age=‘1’
  • 不适用的場景
  • 資料量少的情況下不建議用索引
  • 離散低的不建議用索引如 sex 男女
    • 頻繁更新的字段不建議加索引

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

步驟:

  • 檢視死鎖日志show engine innodb status;
  • 找出死鎖sql
  • 分析sql加鎖情況
  • 模拟死鎖案發
  • 分析死鎖日志
  • 分析死鎖結果

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

  • 加索引
  1. 查詢條件包含or 會導緻索引失效
  2. 組合索引中,查詢時要按照最左原則進行where條件判斷
  3. like中 "%asdg"會導緻索引失效
  4. 對索引進行函數操作或加減會導緻索引失效
  5. 對索引進行函數操作或加減會導緻索引失效
  6. 索引中使用!= 或者 not in 會失效
  • 資料處理多時要分批次進行
  • 盡量避免使用2個表以上的join
  • 滿足三大範式
  • 主從複制讀寫分離
  • 分表分庫

    -…

4. 分庫分表的設計

  • 水準分庫:以字段為依據,将一個庫中的資料拆分到多個庫中
  • 水準分表:以字段為依據,将一個表中的資料拆分到多個表中
  • 垂直分庫:以表為依據,按照業務歸屬不同,将不同的表拆到不同的庫中
  • 垂直分表:以字段為依據,按照字段的活躍性,将表中字段拆到不同的表中

-分表分庫常用中間件 sharding-jdbc 和 mycat

5. InnoDB與MyISAM的差別

// 事務 索引 鎖

  • I 支援事務,M不支援事物
  • I 支援外鍵,M不支援外鍵
  • I 支援MVCC,M不支援
  • select count(*) from table 時 M快,因為他有一個變量存着表的總行數,I需要全表掃描
  • I 支援表 行鎖,M隻支援表鎖

6. 資料庫索引的原理,為什麼要用 B+樹,為什麼不用二叉樹?

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

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

  • 如果id是連續的,可以傳回上次查詢的最大記錄,再往下limit
  • 在業務允許的情況是下限制頁數 ,是否需要如此靠後的資料
  • order by + 索引 (id為索引)

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

  • UUID
  • 雪花算法
  • Redis生成ID

10. 事務的隔離級别有哪些?MySQL的預設隔離級别是什麼?

讀髒:一個事務對資料進行了修改但未送出,另一個事務也在通路這個資料并且讀到了修改的資料

不可重複讀:A事務多次讀,B事務在A讀取中修改了資料,可能造成結果不一緻

幻讀:一個事務在讀取某一範圍資料的時候,另一個事務在該範圍内插入了新行,再次讀取的時候與之前的資料不一緻

  1. 讀未送出
  • 這種事務隔離級别下,select語句不加鎖,此時可能不一緻的資料,讀髒。是并發最高,一緻性最差的隔離級别
  1. 讀送出 RC
  • 可能會出現幻讀
  1. 可重複讀 RR
  • 無論讀幾次都不會讀到重複的資料
  1. 串行化
  • 如果右未送出的事務正在修改某些行,所有讀取這些行的select就會被堵塞住,一緻性最好的,但并發性最差的隔離級别。

11. 在高并發情況下,如何做到安全的修改同一行資料?

  1. 使用悲觀鎖
  • for update ,本次事務送出之前,别的線程都無法修改這些記錄
  1. 使用樂觀鎖
  • 有線程進來,先放過去修改,如果看到别的線程沒修改過,就可以修改成功。如果别的線程修改過,就修改失敗或者重試

12. 資料庫的樂觀鎖和悲觀鎖

  • 悲觀鎖 ,任何事務都不能對資料進行修改,隻能等待鎖被釋放後才能執行
  • 樂觀鎖,先把線程放進來,如果沒有其他線程對資料進行修改則可以修改成功,否則修改失敗或者重試。

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

  1. show status 了解各種sql的執行頻率
  2. 通過慢日志定位那些執行效率低的sql語句
  3. explain分析低效的sql執行計劃

14. select for update有什麼含義,會鎖表還是鎖行還是其他?

  • 是悲觀鎖,用索引是行鎖,沒有是表鎖

15. MySQL事務得四大特性以及實作原理

  • 原子性:要麼全部執行,全部不執行
  • 一緻性:事務開始前後,資料不會被破壞
  • 隔離性:事務與事務之間互相隔離,不會沖突
  • 持久性:會永久的儲存到資料庫中

16. 如果某個表有近千萬資料,CRUD比較慢,如何優化?

  • 優化sql語句,加索引,适當反三範式,适當備援
  • 可以将一部分常用的資料存到redis中
  • 主從複制,讀寫分離
  • 水準分庫分表,垂直分庫分表

17. 如何寫sql能夠有效的使用到複合索引?

  • 注意查詢sql條件的順序,確定最左比對原則有效

18. mysql中in 和exists的差別

  • 如果子查詢的表資料比主查詢中的少,适合用in。如果子查詢的表資料比主查詢中的多,适合用exists

19. 資料庫自增主鍵可能遇到什麼問題?

  • 使用自增主鍵進行分表分庫時,會造成主鍵重複問題,可以使用UUID。
  • 自增主鍵可能會用完

20. MVCC底層原理

21. 資料庫中間件了解過嗎,sharding jdbc,mycat?

  • sharding-jdbc基于jdbc驅動,無需額外的proxy。Mycat基于proxy

22. MySQL的主從延遲,你怎麼解決?

  • 主從複制分了五個步驟進行:
  1. 主庫的更新寫入到binlog
  2. 從庫發起連接配接,連接配接到主庫
  3. 主庫建立一個binlog dump thread發送到從庫,将binlog發送的從庫
  4. 從庫建立一個I/O線程,讀取主庫傳來的binlog内容寫入到relay log
  5. 從庫建立一個sql線程,從relay log中讀取内容,将内容寫入到從庫

這種問題,注意了。劃重點。問你出現問題,尋找解決方案的時候,一定要對症下藥,也就是說這個問題你可以這樣考慮,什麼情況下導緻的主從延遲。

  1. 如果主庫和從庫伺服器配置不一樣,從庫的差點,那麼就可能導緻延遲時間加長。這時候,換成相同的伺服器配置伺服器即可。
  2. 從庫壓力太大了。一般主從了,從庫基本用來查詢,比如可能營運或者開發者自己都在從庫上進行一系列的 sql 操作。那簡單呗。多配幾個從庫,分攤壓力,一主多從。
  3. 大事務。比如 delete 這種語句 不 limit 限制一下,如果資料量過大,導緻主庫運作時都花費了長時間,再同步到從庫,這個時間間隔過長。

23. 說一下大表查詢的優化方案

分表分庫,sql優化+索引 加緩存 ,主從複制讀寫分離

同16

24. 什麼是資料庫連接配接池?為什麼需要資料庫連接配接池呢?

25. 一條SQL語句在MySQL中如何執行的?

26. InnoDB引擎中的索引政策,了解過嗎?

27. 資料庫存儲日期格式時,如何考慮時區轉換問題?

  • datetime 類型适用于資料原始的建立時間,修改其他字段值時,datetime 字段不會改變
  • timestamp 類型會記錄資料最後一次修改的時間,且自動更新

28. 一條sql執行過長的時間,你如何優化,從哪些方面入手?

  • 是否用到了多表和子查詢,優化sql結構,比如除去備援字段
  • 優化索引結構,是否可以适當增加索引
  • 分表分庫
  • explain分析sql語句
  • 主從複制 讀寫分離
  • 檢視mysql 慢日志

29. Blob和text有什麼差別?

30. MySQL裡記錄貨币用什麼字段類型比較好?

decimal / numeric

31. InnoDB有哪幾種鎖?

  1. 共享鎖和排他鎖
  • 如果沒有指定某行,兩個都是行鎖否則就是表鎖
  • share: for share 允許多個事務同時讀同一記錄,互不幹擾,但不允許加其他鎖
  • exclusive: for update 隻有一個事務可以寫資料
  1. 意向鎖 Intention
  • 未來某個時間要加 share/ exclusive 鎖
  • 是一個表級别的鎖
  1. 記錄鎖 Record
  • 封鎖索引記錄 for update 防止其他事務插入更新删除
  1. 間隙鎖 gap
  • 封鎖索引記錄中的間隔,防止其他事務在間隔中插入資料,導緻不可重複讀
  1. 插入意向鎖 insert intention
  • 在行插入之前由插入操作設定的一種間隙鎖
  1. 自增鎖 auto-inc

-AUTO-INC鎖是一種特殊的表級鎖,由插入到具有自動增量列的表中的事務使用。

  1. 下一個鍵鎖(臨界鎖) Next-Key

32. Hash索引和B+樹差別是什麼?你在設計索引是怎麼抉擇的?

  1. B+支援範圍搜尋
  2. B+支援聯合索引的最左原則
  3. B+支援order by
  4. B+支援like模糊
  5. hash等值查詢效率高

33. mysql 的内連接配接、左連接配接、右連接配接有什麼差別?

  • 内連接配接,隻傳回比對的結果集
  • 左連接配接,傳回左表的所有行,即時右表沒有比對的記錄
  • 右連接配接,傳回右表的所有行,即時左表沒有比對的記錄

34. 什麼是内連接配接、外連接配接、交叉連接配接、笛卡爾積呢?

  • 内連接配接(inner join):取得兩張表中滿足存在連接配接比對關系的記錄。
  • 外連接配接(outer join):取得兩張表中滿足存在連接配接比對關系的記錄,以及某張表(或兩張表)中不滿足比對關系的記錄。
  • 交叉連接配接(cross join):顯示兩張表所有記錄一一對應,沒有比對關系進行篩選,也被稱為:笛卡爾積。

35. 說一下資料庫的三大範式

  1. 資料庫表的每一列都是不可拆分的
  2. 在1的基礎上 每一列都與主鍵直接相關
  3. 在2的基礎上,每一列資料都與主鍵直接相關

36. mysql有關權限的表有哪幾個呢?

user權限表:記錄允許連接配接到伺服器的使用者帳号資訊,裡面的權限是全局級的。

db權限表:記錄各個帳号在各個資料庫上的操作權限。

table_priv權限表:記錄資料表級的操作權限。

columns_priv權限表:記錄資料列級的操作權限。

host權限表:配合db權限表對給定主機上資料庫級操作權限作更細緻的控制。這個權限表不受GRANT和REVOKE語句的影響。

37. 主從複制binlog格式有哪幾種?有什麼差別?

38. Mysql主從複制方式?有什麼差別?

39. InnoDB記憶體結構包含四大核心元件

40. 索引有哪些優缺點?

  • 唯一索引可以保證資料庫表中每一行資料的唯一性
  • 索引可以加快查詢速度,減少查詢時間
  • 建立索引和維護索引需要時間
  • 表中資料進行增删改時,索引也要動态的維護

41. 索引有哪幾種類型?

  1. 主鍵索引:資料列不允許重複 不允許為空 隻能有一個主鍵
  2. 唯一索引:資料列不允許重複 允許為空 可以建立多個索引
  3. 普通索引: 允許為空 可以建立多個索引
  4. 全文索引:可以對文本的内容進行分詞,搜尋
  5. 覆寫索引:查詢列要被所建的索引覆寫,不必讀取資料行
  6. 組合索引:多個列組成一個索引,用于組合搜尋

42. 建立索引的三種方式

  • create index index_name on table table_name(column)
  • alter table table_name add index index_name(column)

43. 百萬級别或以上的資料,你是如何删除的?

  • 先删除表中的索引,在删除資料,在建立索引

44. 覆寫索引、回表等這些,了解過嗎?

  • 覆寫索引:查詢列要被所建立的索引覆寫,這樣查詢資料時不會去查詢資料列
  • 回表:

45. B+樹在滿足聚簇索引和覆寫索引的時候不需要回表查詢資料?

46. 何時使用聚簇索引與非聚簇索引

47. 非聚簇索引一定會回表查詢嗎?

48. 組合索引是什麼?為什麼需要注意組合索引中的順序?

  • 組合索引:由多個列建立的索引。索引政策是最左原則

49. 什麼是死鎖?怎麼解決?

  • 死鎖是指兩個或以上的事務占用同一資源并請求鎖定對方資源,進而導緻形成惡性循環的現象
  • 死鎖的四個必要條件:互斥,請求和保持,環路等待,不剝奪。解決思路是切斷環路

50. 你是如何監控你們的資料庫的?你們的慢日志都是怎麼查詢的?

  • zabbix,lepus

mysql 分區有哪幾種

RANGE分區:基于屬于一個給定連續區間的列值,把多行配置設定給分區。

LIST分區:類似于按RANGE分區,差別在于LIST分區是基于列值比對一個離散值集合中的某個值來進行選擇。

HASH分區:基于使用者定義的表達式的傳回值來進行選擇的分區,該表達式使用将要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL 中有效的、産生非負整數值的任何表達式。

KEY分區:類似于按HASH分區,差別在于KEY分區隻支援計算一列或多列,且MySQL伺服器提供其自身的哈希函數。必須有一列或多列包含整數值。

索引底層是什麼資料結構?

B + 樹。

為什麼用的是 B + 樹,不能使用紅黑樹或者其他的?

可以使用紅黑樹。但是這樣的話可能會造成樹的高度過高,意味着相同查詢下,會進行更多的磁盤 I/O,影響性能,而 B+ 樹可以保持樹的高度不至于過高