MySql面試題整理

簡單說兩句:在整理MySql數據庫知識點之前,我對於MySql的瞭解在 CRUD、創建數據庫、表、設計字段、創建索引的基本層面。對於sql語句的優化也就記住了創建索引、用exists代替in,分表分庫、讀寫分離。但是你要問我索引怎麼設計,什麼時候索引會失效、分表怎麼分、數據庫字段長度都要設置成多少、tinyint能存多少,int能存多少,varchar能存多少,數據庫編碼gbk和utf-8區別、MyISAMh和InnoDB什麼區別,各自適合哪種場景。我基本說不上來。每次升級把數據庫提交給負責人的時候都是心驚膽戰,有種老師批改作業的既視感 /哭笑

·

面試題:主張言簡意賅,精確概括

  1. ACID是什麼
    • Atomicity原子性:一個事務中的所有操作或者全部完成,或者全部不完成
    • Consistency一致性:在事務開始之前和結束之後,數據庫的完整性沒有被破壞
    • Isloation隔離性:數據庫允許多個併發事務同時對數據庫進行讀寫操作,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致,事務隔離級別包括:讀未提交,讀計較,可重複讀,串行話
    • Durability持久性:事務處理完後,對數據的修改是永久性的
  2. char和varchar區別
    • char:固定長度,當輸入的內容不足時,用空字符填充,優點:效率高,缺點:佔用空間
    • varchar:可變長度,在varchar小於255時用一個字節來存儲長度,大於255時,用兩個字節來存儲字符串長度
  3. float和double區別
    • float最多存儲8位的十進制,佔4個字節
    • double最多存儲16位的十進制,佔8個字節
  4. 內連接、左連接、右連接的區別
    • 內連接:把匹配的關聯數據顯示出來
    • 左連接:把左邊表中的數據全部顯示出來
    • 右連接:把右邊表中的數據全部顯示出來
  5. 如何驗證索引是否滿足需求
    • explain select * from …
  6. 事務的隔離級別
    • read-uncommitted:未提交讀,最低隔離級別,事務未提交前,就可以被其他事務讀取
    • read-committed:提交讀,一個事務提交後才能被其他事務讀取到
    • repeatable-read:可重複讀,默認級別,保證多次讀取同一個數據時,其值都和事務開始時候的內容一致,禁止讀取到別的事務未提交的數據
    • serializable:序列化,代價最高最可靠的隔離級別
    • 注意一點,myIsam是不支持事務的,而InnoDB支持
    • 髒讀:一個事務能讀取到另一個事務未提交的數據
    • 不可重複讀:在一個事務中,多次讀取同一數據
    • 幻讀:用一事務內多是查詢返回的結果集不一樣
  7. InnoDB和MyIASM引擎
    • InnoDB支持acid事務,提供了行級鎖和外鍵約束,設計的目標是處理大數據容量的數據庫系統,Mysql運行的時候Innodb會在內存中建立緩衝池用於數據緩衝和索引,但是不支持全文索引,不會保存表的行數,進行select count(*) 會掃描全表,由於鎖的粒度小,寫操作不會鎖定全表,在併發度較高的場景下使用會提升效率
    • MyISAM 不提供事務,不提供行級鎖,當執行插入和更新語句時,後需要鎖定表,併發操作時效率不及innodb,但是支持全文索引,保存表的行數,索引文件與數據文件分開單獨存放,適用於讀操作遠大於寫操作的場景
  8. 樂觀鎖和悲觀鎖
    • 樂觀鎖:每次讀取數據的時候都認爲別人不會修改,所以不上鎖
    • 悲觀鎖:每次讀取數據的時候都認爲別人會修改,所以上個鎖
  9. MyISAM CHK 是什麼
    • 用來壓縮MyISAM表,減少磁盤使用空間
  10. MyISAM static 和 MyISAM Dynamic 區別
    • static:所有字段有固定款第
    • dynamic:將具有TEXT、BLOB等字段用不同長度的數據類型
  11. 如果一個表有一列定義爲TIMESTAMP,將發生什麼
    • mysql 5.5版本及以前,只能有一個
    • mysql 5.5版本以後,可以有多個,直接在新增數據時直接插入
  12. BLOB和TEXT區別
    • BLOB區分大小寫,TEXT不區分大小寫
  13. MyISAM存儲格式
    • 每個MyISAM表格以三種格式存儲在磁盤上
    • .frm:文件存儲表定義
    • .myd(mydata) 數據文件
    • .myi(myindex) 索引文件
  14. NOW() 和 CURRENT_DATE() 區別
    • NOW() 用於顯示當前年月日 時分秒
    • CURRENT_DATE() 顯示年月日
  15. 數據庫怎麼優化
    • 允許部分字段冗餘,儘量避免join查詢
    • 選擇合適的字段類型和存儲引擎
    • 添加索引
    • 主從分離
    • 垂直拆分數據庫
    • 添加緩存
    • 書寫高效sql
  16. 鎖怎麼優化
    • 讀寫分離
    • 分段加鎖
    • 減少鎖時間
    • 不要將鎖的粒度過於細化,不然可能會出現線程的加鎖和釋放次數過多,反而效果不如大鎖
  17. 索引的底層實現
    • B+ Tree
  18. 什麼樣的索引設置了無法使用
    • %開頭的like
    • or
    • 數據類型出現隱式轉化:如varchar 不加單引號的話可能會自動轉化爲int型
  19. mysql的優化方向
    • 索引
    • sql語句
    • 高併發情況下
    • 分佈式緩存
    • CDN
    • 數據庫讀寫分離
  20. 存儲時間
    • DateTime 以YYYY-MM-DD HH:MM:SSS 存儲時間,佔用8個字節且與時區無關
    • Timestamp: 以時間戳格式存儲,範圍在1970-1-1 到 2038-1-19,顯示依賴於設置的時區,佔用4個字,也是以YYYY-MM-DD HH:MM:SSS顯示
    • Date:佔用3個字節,存儲年月日
    • Time: 顯示時分秒
    • 使用int存儲日期時間不如使用timestamp
  21. 什麼是基本表,什麼是視圖
    • 基本表:本身獨立存在的表,在sql中一個關係就對應一個表
    • 視圖:一個或者幾個基本表導出的表,視圖本身不獨立存儲在數據庫中,是一個虛表
  22. null是什麼
    • null 表示unknow,不表示""(空串),對null這個值的任何比較都會產生一個null值,可以用 is null 來判斷 null
  23. 對sql語句優化的方法有哪些
    • 用exists替代 in ,用 not exists 替代 not in
    • 避免在所以列上使用計算
    • 避免中斷索引
    • 對查詢進行優化,應儘量避免全表掃描,首先應考慮在where及order by 、group by涉及的列上建立索引
    • 儘量避免在where子句中對字段進行null值判斷,否則將導致索引失效,進行全表掃描
    • 儘量避免在where子句中對字段進行表達式操作

提升自己的核心競爭力,學會爲自己撐傘, 你可以的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章