MySQl數據庫的一些面試問題

MySQl數據庫的一些面試問題

前言

面試了一些公司 也見識到了一些套路
對於數據庫考察方面 一般也就是一下這些問題

對於MySQL數據庫 主要關注點就在

  • 存儲引擎
  • 事務
  • 索引

這幾個方面

存儲引擎

考點一般是問一下MySQL有哪些存儲引
你用過哪幾種?

mysql提供了多種存儲引擎

使用

SHOW ENGINES;

語句可以顯示MySQL支持的所有存儲引擎

此處使用的MySQL版本是8.0.11
MySQL Engineer

可以看到MySQL 8.0 提供了9種存儲引擎,各有用處

字段 內容
Support 表示是否支持
Comment 簡要描述此存儲引擎
Transaction 事務支持
XA 分佈式事務支持
Savepoints 保存點支持

不同的存儲引擎用於不同的情況

Memory 引擎

基於散列表的內存存儲引擎
主要用於保存臨時數據
支持的索引是散列索引

MyIsam 引擎

常用引擎
MySQL 5.1之前的默認存儲與年輕。它是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事務

MRG_MyIsam 引擎

支持分庫分表的MyIsam引擎 ,用於大數據量的情況行 進行分庫分表。
可以理解爲分表時的MyIsam引擎

CSV 引擎

將數據存儲爲CSV格式的引擎。
數據以文本方式存儲在文件中
不支持索引
不常用的引擎
說實話 我不知道這個引擎有啥用

Federated 引擎

遠程連接其他數據庫的引擎,用於創建一個遠程數據庫映射到本地數據庫的景象

Performance 引擎

用於監控數據運行情況的引擎
一般數據存儲用不到

InnoDB 引擎

常用引擎
InnoDB是事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵,MySQL 5.1之後,InnoDB是默認的MySQL引擎。

Blackhole 引擎

黑洞引擎,寫入的任何數據都會消失,用於記錄二進制日誌 做複製的中繼存儲
用於MySQL主從複製的拓撲中

Archive 引擎

歸檔引擎 用於存儲需要歸檔數據
不支持事務 也不支持索引
特點是存儲空間大小無限制


從以上內容可知
常用的存儲引擎就是
MyIsam和InnoDB
所以一般回答
用過MyIsam和InnoDB即可

知識點

InnoDB存儲引擎

InnoDB是事務型數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵

1、InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事物安全(ACID兼容)存儲引擎。InnoDB鎖定在行級並且也在SELECT語句中提供一個類似Oracle的非鎖定讀。這些功能增加了多用戶部署和性能。在SQL查詢中,可以自由地將InnoDB類型的表和其他MySQL的表類型混合起來,甚至在同一個查詢中也可以混合

2、InnoDB是爲處理巨大數據量的最大性能設計。它的CPU效率可能是任何其他基於磁盤的關係型數據庫引擎鎖不能匹敵的

3、InnoDB存儲引擎完全與MySQL服務器整合,InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它自己的緩衝池。InnoDB將它的表和索引在一個邏輯表空間中,表空間可以包含數個文件(或原始磁盤文件)。這與MyISAM表不同,比如在MyISAM表中每個表被存放在分離的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制爲2GB的操作系統上

4、InnoDB支持外鍵完整性約束,存儲表中的數據時,每張表的存儲都按主鍵順序存放,如果沒有顯示在表定義時指定主鍵,InnoDB會爲每一行生成一個6字節的ROWID,並以此作爲主鍵

5、InnoDB被用在衆多需要高性能的大型數據庫站點上

InnoDB不創建目錄,使用InnoDB時,MySQL將在MySQL數據目錄下創建一個名爲ibdata1的10MB大小的自動擴展數據文件,以及兩個名爲ib_logfile0和ib_logfile1的5MB大小的日誌文件

要點

  • 支持ACID事務
  • 支持外鍵
  • 支持行級鎖
  • 支持多版本併發
  • 支持數據緩存和索引緩存
  • 索引爲B+樹
  • 不支持全文索引

一般問題就在這些裏面

MyISAM存儲引擎

MyISAM擁有較高的插入、查詢速度,但不支持事物。MyISAM主要特性有:

1、大文件(達到63位文件長度)在支持大文件的文件系統和操作系統上被支持

2、當把刪除和更新及插入操作混合使用的時候,動態尺寸的行產生更少碎片。這要通過合併相鄰被刪除的塊,以及若下一個塊被刪除,就擴展到下一塊自動完成

3、每個MyISAM表最大索引數是64,這可以通過重新編譯來改變。每個索引最大的列數是16

4、最大的鍵長度是1000字節,這也可以通過編譯來改變,對於鍵長度超過250字節的情況,一個超過1024字節的鍵將被用上

5、BLOB和TEXT列可以被索引

6、NULL被允許在索引的列中,這個值佔每個鍵的0~1個字節

7、所有數字鍵值以高字節優先被存儲以允許一個更高的索引壓縮

8、每個MyISAM類型的表都有一個AUTO_INCREMENT的內部列,當INSERT和UPDATE操作的時候該列被更新,同時AUTO_INCREMENT列將被刷新。所以說,MyISAM類型表的AUTO_INCREMENT列更新比InnoDB類型的AUTO_INCREMENT更快

9、可以把數據文件和索引文件放在不同目錄

10、每個字符列可以有不同的字符集

11、有VARCHAR的表可以固定或動態記錄長度

12、VARCHAR和CHAR列可以多達64KB

使用MyISAM引擎創建數據庫,將產生3個文件。文件的名字以表名字開始,擴展名之處文件類型:frm文件存儲表定義、數據文件的擴展名爲.MYD(MYData)、索引文件的擴展名時.MYI(MYIndex)

要點

  • 不支持事務 但是每次查詢都是原子的
  • 不支持外鍵
  • 不支持行級鎖 只支持表級鎖
  • 不支持數據緩存 只索引緩存
  • 索引爲B+樹
  • 支持全文索引

存儲引擎的考點就以上這些內容

索引與鎖

索引的考點 一般是
索引怎麼創建最好
索引失效的情景

MySQL 一共有兩種索引 散列索引和B+樹索引
Memory引擎支持三類索引
而MyIsam引擎和InnoDB引擎是B+樹索引

B+樹引擎又分爲聚簇索引和非聚簇索引
MyIsam引是非聚簇索引,InnoDB是聚簇索引

由於Hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最後才能訪問到葉子節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高於 B-Tree 索引
但Hash索引也存在許多自身的問題
所以常用的存儲引擎MyIsam和InnoDB都沒有選擇Hash索引

我們只需熟記B+樹索引的問題即可

B-Tree 索引是 MySQL 數據庫中使用最爲頻繁的索引類型,除了 Archive 存儲引擎之外的其他所有的存儲引擎都支持 B-Tree 索引。不僅僅在 MySQL 中是如此,實際上在其他的很多數據庫管理系統中B-Tree 索引也同樣是作爲最主要的索引類型,這主要是因爲 B-Tree 索引的存儲結構在數據庫的數據檢 索中有非常優異的表現。

Innodb的主索引文件上 直接存放該行數據,稱爲聚簇索引,次索引指向對主鍵的引用。
myisam中, 主索引和次索引,都指向物理行(磁盤位置).

哪些字段需要創建索引?

  • 表的主鍵
  • 直接條件查詢的字段
  • 經常用於條件約束的字段
  • 查詢中與其它表關聯的字段
  • 查詢中排序的字段
  • 查詢中統計或分組統計的字段

什麼情況下不需要索引?

  • 表記錄太少
  • 頻繁插入、刪除、修改的表
  • 數據重複且分佈平均的表字段

根據以上知識點
回答索引創建的問題
爲主要查詢的字段添加索引,儘量創建複合索引
根據Mysql的左側匹配原則 在創建複合索引時應該將最常用作限制條件的列放在最左邊,依次遞減
索引不應包含有NULL值的列

索引失效的情況

1.索引無法存儲null值
所以要索引的行 不要允許null值
2.前導模糊查詢不能利用索引(like '%XX’或者like ‘%XX%’)
儘量使用 like ‘XX%’
3.如果條件中有or,即使其中有條件帶索引也不會使用
要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引
4.對於多列符複合索引,查詢條件不是從第一個索引開始,則不會使用索引
左匹配原則 所以要存在多個索引時 儘量將查詢條件中存在索引的字段放在最左側
5.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引

鎖的考點一般是
什麼情況下是行級鎖
什麼情況下是表級鎖

InnoDB的鎖其實還是比較複雜的 一共有七種鎖
但實際上面試考不了那麼深入
所以只要記住一部分內容即可

InnoDB的是在SQL語句的執行過程中通過掃描索引記錄的方式來實現加鎖行爲的
即InnoDB實際上是給索引加鎖

InnoDB這種行鎖實現特點意味者:只有通過索引條件檢索數據,InnoDB纔會使用行級鎖,否則,InnoDB將使用表鎖!
在實際應用中,要特別注意InnoDB行鎖的這一特性,不然的話,可能導致大量的鎖衝突,從而影響併發性能。

select … from for update語句 強制使用表鎖

update…where,delete…where 語句 使用行級鎖
insert 在要插入的一行上使用行級鎖

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