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