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的?
- 加索引
- 查詢條件包含or 會導緻索引失效
- 組合索引中,查詢時要按照最左原則進行where條件判斷
- like中 "%asdg"會導緻索引失效
- 對索引進行函數操作或加減會導緻索引失效
- 對索引進行函數操作或加減會導緻索引失效
- 索引中使用!= 或者 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讀取中修改了資料,可能造成結果不一緻
幻讀:一個事務在讀取某一範圍資料的時候,另一個事務在該範圍内插入了新行,再次讀取的時候與之前的資料不一緻
- 讀未送出
- 這種事務隔離級别下,select語句不加鎖,此時可能不一緻的資料,讀髒。是并發最高,一緻性最差的隔離級别
- 讀送出 RC
- 可能會出現幻讀
- 可重複讀 RR
- 無論讀幾次都不會讀到重複的資料
- 串行化
- 如果右未送出的事務正在修改某些行,所有讀取這些行的select就會被堵塞住,一緻性最好的,但并發性最差的隔離級别。
11. 在高并發情況下,如何做到安全的修改同一行資料?
- 使用悲觀鎖
- for update ,本次事務送出之前,别的線程都無法修改這些記錄
- 使用樂觀鎖
- 有線程進來,先放過去修改,如果看到别的線程沒修改過,就可以修改成功。如果别的線程修改過,就修改失敗或者重試
12. 資料庫的樂觀鎖和悲觀鎖
- 悲觀鎖 ,任何事務都不能對資料進行修改,隻能等待鎖被釋放後才能執行
- 樂觀鎖,先把線程放進來,如果沒有其他線程對資料進行修改則可以修改成功,否則修改失敗或者重試。
13. SQL優化的一般步驟是什麼,怎麼看執行計劃(explain),如何了解其中各個字段的含義?
- show status 了解各種sql的執行頻率
- 通過慢日志定位那些執行效率低的sql語句
- 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的主從延遲,你怎麼解決?
- 主從複制分了五個步驟進行:
- 主庫的更新寫入到binlog
- 從庫發起連接配接,連接配接到主庫
- 主庫建立一個binlog dump thread發送到從庫,将binlog發送的從庫
- 從庫建立一個I/O線程,讀取主庫傳來的binlog内容寫入到relay log
- 從庫建立一個sql線程,從relay log中讀取内容,将内容寫入到從庫
這種問題,注意了。劃重點。問你出現問題,尋找解決方案的時候,一定要對症下藥,也就是說這個問題你可以這樣考慮,什麼情況下導緻的主從延遲。
- 如果主庫和從庫伺服器配置不一樣,從庫的差點,那麼就可能導緻延遲時間加長。這時候,換成相同的伺服器配置伺服器即可。
- 從庫壓力太大了。一般主從了,從庫基本用來查詢,比如可能營運或者開發者自己都在從庫上進行一系列的 sql 操作。那簡單呗。多配幾個從庫,分攤壓力,一主多從。
- 大事務。比如 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有哪幾種鎖?
- 共享鎖和排他鎖
- 如果沒有指定某行,兩個都是行鎖否則就是表鎖
- share: for share 允許多個事務同時讀同一記錄,互不幹擾,但不允許加其他鎖
- exclusive: for update 隻有一個事務可以寫資料
- 意向鎖 Intention
- 未來某個時間要加 share/ exclusive 鎖
- 是一個表級别的鎖
- 記錄鎖 Record
- 封鎖索引記錄 for update 防止其他事務插入更新删除
- 間隙鎖 gap
- 封鎖索引記錄中的間隔,防止其他事務在間隔中插入資料,導緻不可重複讀
- 插入意向鎖 insert intention
- 在行插入之前由插入操作設定的一種間隙鎖
- 自增鎖 auto-inc
-AUTO-INC鎖是一種特殊的表級鎖,由插入到具有自動增量列的表中的事務使用。
- 下一個鍵鎖(臨界鎖) Next-Key
32. Hash索引和B+樹差別是什麼?你在設計索引是怎麼抉擇的?
- B+支援範圍搜尋
- B+支援聯合索引的最左原則
- B+支援order by
- B+支援like模糊
- hash等值查詢效率高
33. mysql 的内連接配接、左連接配接、右連接配接有什麼差別?
- 内連接配接,隻傳回比對的結果集
- 左連接配接,傳回左表的所有行,即時右表沒有比對的記錄
- 右連接配接,傳回右表的所有行,即時左表沒有比對的記錄
34. 什麼是内連接配接、外連接配接、交叉連接配接、笛卡爾積呢?
- 内連接配接(inner join):取得兩張表中滿足存在連接配接比對關系的記錄。
- 外連接配接(outer join):取得兩張表中滿足存在連接配接比對關系的記錄,以及某張表(或兩張表)中不滿足比對關系的記錄。
- 交叉連接配接(cross join):顯示兩張表所有記錄一一對應,沒有比對關系進行篩選,也被稱為:笛卡爾積。
35. 說一下資料庫的三大範式
- 資料庫表的每一列都是不可拆分的
- 在1的基礎上 每一列都與主鍵直接相關
- 在2的基礎上,每一列資料都與主鍵直接相關
36. mysql有關權限的表有哪幾個呢?
user權限表:記錄允許連接配接到伺服器的使用者帳号資訊,裡面的權限是全局級的。
db權限表:記錄各個帳号在各個資料庫上的操作權限。
table_priv權限表:記錄資料表級的操作權限。
columns_priv權限表:記錄資料列級的操作權限。
host權限表:配合db權限表對給定主機上資料庫級操作權限作更細緻的控制。這個權限表不受GRANT和REVOKE語句的影響。
37. 主從複制binlog格式有哪幾種?有什麼差別?
38. Mysql主從複制方式?有什麼差別?
39. InnoDB記憶體結構包含四大核心元件
40. 索引有哪些優缺點?
- 唯一索引可以保證資料庫表中每一行資料的唯一性
- 索引可以加快查詢速度,減少查詢時間
- 建立索引和維護索引需要時間
- 表中資料進行增删改時,索引也要動态的維護
41. 索引有哪幾種類型?
- 主鍵索引:資料列不允許重複 不允許為空 隻能有一個主鍵
- 唯一索引:資料列不允許重複 允許為空 可以建立多個索引
- 普通索引: 允許為空 可以建立多個索引
- 全文索引:可以對文本的内容進行分詞,搜尋
- 覆寫索引:查詢列要被所建的索引覆寫,不必讀取資料行
- 組合索引:多個列組成一個索引,用于組合搜尋
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+ 樹可以保持樹的高度不至于過高