除了基礎題部分,小編計劃收集整理的MySQL面試題還包括如下知識點或題型:
MySQL高性能索引
SQL語句
MySQL查詢優化
MySQL高擴展高可用
MySQL安全性
首先我們先來看一道真題:
真題
請寫出下面MySQL數據類型表達的意義(int(0)、char(16)、varchar(16)、datetime、text)
知識點分析
此真題主要考察的是MySQL數據類型。MySQL數據類型屬于MySQL數據庫基礎,由此延伸出的知識點還包括如下內容:
MySQL基礎操作
MySQL存儲引擎
MySQL鎖機制
MySQL事務處理、存儲過程、觸發器
下面我們就來將這些知識一網打盡
數據類型考點:
1、整數類型,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分別表示1字節、2字節、3字節、4字節、8字節整數。任何整數類型都可以加上UNSIGNED屬性,表示數據是無符號的,即非負整數。
長度:整數類型可以被指定長度,例如:INT(11)表示長度為11的INT類型。長度在大多數場景是沒有意義的,它不會限制值的合法范圍,只會影響顯示字符的個數,而且需要和UNSIGNED ZEROFILL屬性配合使用才有意義。
例子,假定類型設定為INT(5),屬性為UNSIGNED ZEROFILL,如果用戶插入的數據為12的話,那么數據庫實際存儲數據為00012。
2、實數類型,包括FLOAT、DOUBLE、DECIMAL。
DECIMAL可以用于存儲比BIGINT還大的整型,能存儲精確的小數。
而FLOAT和DOUBLE是有取值范圍的,并支持使用標準的浮點進行近似計算。
計算時FLOAT和DOUBLE相比DECIMAL效率更高一些,DECIMAL你可以理解成是用字符串進行處理。
3、字符串類型,包括VARCHAR、CHAR、TEXT、BLOB
VARCHAR用于存儲可變長字符串,它比定長類型更節省空間。
VARCHAR使用額外1或2個字節存儲字符串長度。列長度小于255字節時,使用1字節表示,否則使用2字節表示。
VARCHAR存儲的內容超出設置的長度時,內容會被截斷。
CHAR是定長的,根據定義的字符串長度分配足夠的空間。
CHAR會根據需要使用空格進行填充方便比較。
CHAR適合存儲很短的字符串,或者所有值都接近同一個長度。
CHAR存儲的內容超出設置的長度時,內容同樣會被截斷。
使用策略:
對于經常變更的數據來說,CHAR比VARCHAR更好,因為CHAR不容易產生碎片。
對于非常短的列,CHAR比VARCHAR在存儲空間上更有效率。
使用時要注意只分配需要的空間,更長的列排序時會消耗更多內存。
盡量避免使用TEXT/BLOB類型,查詢時會使用臨時表,導致嚴重的性能開銷。
4、枚舉類型(ENUM),把不重復的數據存儲為一個預定義的集合。
有時可以使用ENUM代替常用的字符串類型。
ENUM存儲非常緊湊,會把列表值壓縮到一個或兩個字節。
ENUM在內部存儲時,其實存的是整數。
盡量避免使用數字作為ENUM枚舉的常量,因為容易混亂。
排序是按照內部存儲的整數
5、日期和時間類型,盡量使用timestamp,空間效率高于datetime,
用整數保存時間戳通常不方便處理。
如果需要存儲微妙,可以使用bigint存儲。
看到這里,這道真題是不是就比較容易回答了。
答:int(0)表示數據是INT類型,長度是0、char(16)表示固定長度字符串,長度為16、varchar(16)表示可變長度字符串,長度為16、datetime表示時間類型、text表示字符串類型,能存儲大字符串,最多存儲65535字節數據)
MySQL基礎操作:
常見操作
MySQL的連接和關閉:mysql -u -p -h -P
-u:指定用戶名
-p:指定密碼
-h:主機
-P:端口
進入MySQL命令行后:G、c、q、s、h、d
G:打印結果垂直顯示
c:取消當前MySQL命令
q:退出MySQL連接
s:顯示服務器狀態
h:幫助信息
d:改變執行符
MySQL存儲引擎:
1、InnoDB存儲引擎,
默認事務型引擎,最重要最廣泛的存儲引擎,性能非常優秀。
數據存儲在共享表空間,可以通過配置分開。也就是多個表和索引都存儲在一個表空間中,可以通過配置文件改變此配置。
對主鍵查詢的性能高于其他類型的存儲引擎。
內部做了很多優化,從磁盤讀取數據時會自動構建hash索引,插入數據時自動構建插入緩沖區。
通過一些機制和工具支持真正的熱備份。
支持崩潰后的安全恢復。
支持行級鎖。
支持外鍵。
2、MyISAM存儲引擎,
5.1版本前,是默認存儲引擎。
擁有全文索引、壓縮、空間函數。
不支持事務和行級鎖、不支持崩潰后的安全恢復。
表存儲在兩個文件,MYD和MYI。
設計簡單,某些場景下性能很好,例如獲取整個表有多少條數據,性能很高。
全文索引不是很常用,不如使用外部的ElasticSearch或Lucene。
3、其他表引擎,
使用策略
在大多數場景下建議使用InnoDB存儲引擎。
MySQL鎖機制:
表鎖是日常開發中的常見問題,因此也是面試當中最常見的考察點,當多個查詢同一時刻進行數據修改時,就會產生并發控制的問題。
共享鎖和排他鎖,就是讀鎖和寫鎖。
共享鎖,不堵塞,多個用戶可以同時讀一個資源,互不干擾。
排他鎖,一個寫鎖會阻塞其他的讀鎖和寫鎖,這樣可以只允許一個用戶進行寫入,防止其他用戶讀取正在寫入的資源。
鎖的粒度
表鎖,系統開銷最小,會鎖定整張表,MyIsam使用表鎖。
行鎖,最大程度的支持并發處理,但是也帶來了最大的鎖開銷,InnoDB使用行鎖。
MySQL事務處理:
MySQL提供事務處理的表引擎,也就是InnoDB。
服務器層不管理事務,由下層的引擎實現,所以同一個事務中,使用多種引擎是不靠譜的。
需要注意,在非事務表上執行事務操作,MySQL不會發出提醒,也不會報錯。
存儲過程:
為以后的使用保存的一條或多條MySQL語句的集合,因此也可以在存儲過程中加入業務邏輯和流程。
可以在存儲過程中創建表,更新數據,刪除數據等等。
使用策略
可以通過把SQL語句封裝在容易使用的單元中,簡化復雜的操作
可以保證數據的一致性
可以簡化對變動的管理
觸發器:
提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程。
使用場景
可以通過數據庫中的相關表實現級聯更改。
實時監控某張表中的某個字段的更改而需要做出相應的處理。
例如可以生成某些業務的編號。
注意不要濫用,否則會造成數據庫及應用程序的維護困難。
大家需要牢記以上基礎知識點,重點是理解數據類型CHAR和VARCHAR的差異,表存儲引擎InnoDB和MyISAM的區別。
問題1:請說明InnoDB和MyISAM的區別
答:InnoDB支持事務,MyISAM不支持;
InnoDB數據存儲在共享表空間,MyISAM數據存儲在文件中;
InnoDB支持行級鎖,MyISAM只支持表鎖;
InnoDB支持崩潰后的恢復,MyISAM不支持;
InnoDB支持外鍵,MyISAM不支持;
InnoDB不支持全文索引,MyISAM支持全文索引;
問題2:innodb引擎的特性
答:插入緩沖(insert buffer)
二次寫(double write)
自適應哈希索引(ahi)
預讀(read ahead)
問題3:請列舉3個以上表引擎
答:InnoDB、MyISAM、Memory
問題4:請說明varchar和text的區別
答:varchar可指定字符數,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n《=255)或2個字節(n》255),text是實際字符數+2個字節。
text類型不能有默認值。
varchar可直接創建索引,text創建索引要指定前多少個字符。varchar查詢速度快于text,在都創建索引的情況下,text的索引幾乎不起作用。
查詢text需要創建臨時表。
問題5:varchar(50)中50的含義
答:最多存放50個字符,varchar(50)和(200)存儲hello所占空間一樣,但后者在排序時會消耗更多內存,因為order by col采用fixed_length計算col長度(memory引擎也一樣)。
問題6:int(20)中20的含義
答:是指顯示字符的長度,不影響內部存儲,只是當定義了ZEROFILL時,前面補多少個 0
評論
查看更多