前言
所謂金三銀四,想要跳槽進(jìn)大廠的朋友們這段時(shí)間應(yīng)該也都在積極準(zhǔn)備了,MySQL作為最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一廊敌,其重要性想必不需要我多說铜跑,在面試中也幾乎是必問的,而且大一點(diǎn)的公司的話都會問得挺深骡澈。
那么現(xiàn)在準(zhǔn)備得差不多或者壓根還沒準(zhǔn)備但是又想進(jìn)大廠的朋友锅纺,可以一起來看看我給大家整理的這些關(guān)于MySQL的經(jīng)典面試題,你是否都能答得出來呢肋殴?
PS:完整版面試題PDF以及MySQL學(xué)習(xí)筆記
1囤锉、MySQL 中有哪幾種鎖?
1护锤、表級鎖:開銷小官地,加鎖快;不會出現(xiàn)死鎖烙懦;鎖定粒度大驱入,發(fā)生鎖沖突的概率最高,并發(fā)度最低氯析。
2亏较、行級鎖:開銷大,加鎖慢掩缓;會出現(xiàn)死鎖雪情;鎖定粒度最小,發(fā)生鎖沖突的概率最低你辣,并發(fā)度也最高巡通。
3、頁面鎖:開銷和加鎖時(shí)間界于表鎖和行鎖之間舍哄;會出現(xiàn)死鎖宴凉;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般蠢熄。
2跪解、MySQL 中有哪些不同的表格炉旷?
共有 5 種類型的表格:
1签孔、MyISAM
2、Heap
3窘行、Merge
4饥追、INNODB
5、ISAM
3罐盔、簡述在 MySQL 數(shù)據(jù)庫中 MyISAM 和 InnoDB 的區(qū)別
MyISAM:
不支持事務(wù)但绕,但是每次查詢都是原子的;
支持表級鎖,即每次操作是對整個(gè)表加鎖捏顺;
存儲表的總行數(shù)六孵;
一個(gè) MYISAM 表有三個(gè)文件:索引文件、表結(jié)構(gòu)文件幅骄、數(shù)據(jù)文件劫窒;
采用菲聚集索引,索引文件的數(shù)據(jù)域存儲指向數(shù)據(jù)文件的指針拆座。輔索引與主索引基本一致主巍,但是輔索引不用保證唯一性。
InnoDb:
支持 ACID 的事務(wù)挪凑,支持事務(wù)的四種隔離級別孕索;
支持行級鎖及外鍵約束:因此可以支持寫并發(fā);
不存儲總行數(shù):
一個(gè) InnoDb 引擎存儲在一個(gè)文件空間(共享表空間躏碳,表大小不受操作系統(tǒng)控制搞旭,一個(gè)表可能分布在多個(gè)文件里),也有可能為多個(gè)(設(shè)置為獨(dú)立表空唐断,表大小受操作系統(tǒng)文件大小限制选脊,一般為 2G),受操作系統(tǒng)文件大小的限制脸甘;
主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲數(shù)據(jù)文件本身)恳啥,輔索引的數(shù)據(jù)域存儲主鍵的值;
因此從輔索引查找數(shù)據(jù)丹诀,需要先通過輔索引找到主鍵值钝的,再訪問輔索引;
最好使用自增主鍵铆遭,防止插入數(shù)據(jù)時(shí)硝桩,為維持 B+樹結(jié)構(gòu),文件的大調(diào)整枚荣。
4碗脊、MySQL 中 InnoDB 支持的四種事務(wù)隔離級別名稱,以及逐級之間的區(qū)別橄妆?
SQL 標(biāo)準(zhǔn)定義的四個(gè)隔離級別為:
1衙伶、read uncommited :讀到未提交數(shù)據(jù)
2、read committed:臟讀害碾,不可重復(fù)讀
3矢劲、repeatable read:可重讀
4、serializable :串行事物
5慌随、CHAR 和 VARCHAR 的區(qū)別芬沉?
1躺同、CHAR 和 VARCHAR 類型在存儲和檢索方面有所不同
2、CHAR 列長度固定為創(chuàng)建表時(shí)聲明的長度丸逸,長度值范圍是 1 到 255 當(dāng) CHAR值被存儲時(shí)蹋艺,它們被用空格填充到特定長度,檢索 CHAR 值時(shí)需刪除尾隨空格黄刚。
6车海、主鍵和候選鍵有什么區(qū)別?
表格的每一行都由主鍵唯一標(biāo)識,一個(gè)表只有一個(gè)主鍵隘击。
主鍵也是候選鍵侍芝。按照慣例,候選鍵可以被指定為主鍵埋同,并且可以用于任何外鍵
引用州叠。
7、myisamchk 是用來做什么的凶赁?
它用來壓縮 MyISAM 表咧栗,這減少了磁盤或內(nèi)存使用。
MyISAM Static 和 MyISAM Dynamic 有什么區(qū)別虱肄?
在 MyISAM Static 上的所有字段有固定寬度致板。動態(tài) MyISAM 表將具有像 TEXT,BLOB 等字段咏窿,以適應(yīng)不同長度的數(shù)據(jù)類型斟或。
MyISAM Static 在受損情況下更容易恢復(fù)。
8集嵌、如果一個(gè)表有一列定義為 TIMESTAMP萝挤,將發(fā)生什么?
每當(dāng)行被更改時(shí)根欧,時(shí)間戳字段將獲取當(dāng)前時(shí)間戳怜珍。
列設(shè)置為 AUTO INCREMENT 時(shí),如果在表中達(dá)到最大值凤粗,會發(fā)生什么情況酥泛?
它會停止遞增,任何進(jìn)一步的插入都將產(chǎn)生錯(cuò)誤嫌拣,因?yàn)槊荑€已被使用柔袁。
怎樣才能找出最后一次插入時(shí)分配了哪個(gè)自動增量?
LAST_INSERT_ID 將返回由 Auto_increment 分配的最后一個(gè)值亭罪,并且不需要指
定表名稱瘦馍。
9歼秽、你怎么看到為表格定義的所有索引应役?
索引是通過以下方式為表格定義的:
SHOW INDEX FROM <tablename>;
10、LIKE 聲明中的%和_是什么意思?
%對應(yīng)于 0 個(gè)或更多字符箩祥,_只是 LIKE 語句中的一個(gè)字符院崇。
如何在 Unix 和 MySQL 時(shí)間戳之間進(jìn)行轉(zhuǎn)換?
UNIX_TIMESTAMP 是從 MySQL 時(shí)間戳轉(zhuǎn)換為 Unix 時(shí)間戳的命令
FROM_UNIXTIME 是從 Unix 時(shí)間戳轉(zhuǎn)換為 MySQL 時(shí)間戳的命令
11袍祖、列對比運(yùn)算符是什么底瓣?
在 SELECT 語句的列比較中使用=,<>蕉陋,<=捐凭,<,> =凳鬓,>茁肠,<<,>>缩举,<=>垦梆,AND,OR 或 LIKE 運(yùn)算符仅孩。
12托猩、BLOB 和 TEXT 有什么區(qū)別?
BLOB 是一個(gè)二進(jìn)制對象辽慕,可以容納可變數(shù)量的數(shù)據(jù)京腥。TEXT 是一個(gè)不區(qū)分大小寫的 BLOB。
BLOB 和 TEXT 類型之間的唯一區(qū)別在于對 BLOB 值進(jìn)行排序和比較時(shí)區(qū)分大小寫溅蛉,對 TEXT 值不區(qū)分大小寫绞旅。
13、MySQL_fetch_array 和 MySQL_fetch_object 的區(qū)別是什么温艇?
以下是 MySQL_fetch_array 和 MySQL_fetch_object 的區(qū)別:
MySQL_fetch_array() – 將結(jié)果行作為關(guān)聯(lián)數(shù)組或來自數(shù)據(jù)庫的常規(guī)數(shù)組返回因悲。
MySQL_fetch_object – 從數(shù)據(jù)庫返回結(jié)果行作為對象。
14勺爱、MyISAM 表格將在哪里存儲晃琳,并且還提供其存儲格式?
每個(gè) MyISAM 表格以三種格式存儲在磁盤上:
·“.frm”文件存儲表定義
·數(shù)據(jù)文件具有“.MYD”(MYData)擴(kuò)展名
索引文件具有“.MYI”(MYIndex)擴(kuò)展名
15琐鲁、MySQL 如何優(yōu)化 DISTINCT卫旱?
DISTINCT 在所有列上轉(zhuǎn)換為 GROUP BY,并與 ORDER BY 子句結(jié)合使用围段。
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
16顾翼、如何顯示前 50 行?
在 MySQL 中适贸,使用以下代碼查詢顯示前 50 行:
SELECT*FROM
LIMIT 0,50;
17烙样、可以使用多少列創(chuàng)建索引?
任何標(biāo)準(zhǔn)表最多可以創(chuàng)建 16 個(gè)索引列批狱。
18、NOW()和 CURRENT_DATE()有什么區(qū)別卦停?
NOW()命令用于顯示當(dāng)前年份,月份小槐,日期,小時(shí)控嗜,分鐘和秒。
CURRENT_DATE()僅顯示當(dāng)前年份,月份和日期若专。
19膊爪、什么是非標(biāo)準(zhǔn)字符串類型萝喘?
1阁簸、TINYTEXT
2、TEXT
3饶米、MEDIUMTEXT
4、LONGTEXT
20匈棘、什么是通用 SQL 函數(shù)逃默?
1、CONCAT(A, B) – 連接兩個(gè)字符串值以創(chuàng)建單個(gè)字符串輸出。通常用于將兩個(gè)或多個(gè)字段合并為一個(gè)字段乌妙。
2、FORMAT(X, D)- 格式化數(shù)字 X 到 D 有效數(shù)字欲险。
3、CURRDATE(), CURRTIME()- 返回當(dāng)前日期或時(shí)間喜每。
4吨灭、NOW() – 將當(dāng)前日期和時(shí)間作為一個(gè)值返回。
5、MONTH(),DAY(),YEAR()遭赂,WEEK()循诉,WEEKDAY() – 從日期值中提取給定數(shù)據(jù)。
6撇他、HOUR()茄猫,MINUTE(),SECOND() – 從時(shí)間值中提取給定數(shù)據(jù)困肩。
7划纽、DATEDIFF(A,B) – 確定兩個(gè)日期之間的差異锌畸,通常用于計(jì)算年齡
8勇劣、SUBTIMES(A,B) – 確定兩次之間的差異。
9比默、FROMDAYS(INT) – 將整數(shù)天數(shù)轉(zhuǎn)換為日期值幻捏。
21、MySQL 支持事務(wù)嗎命咐?
在缺省模式下篡九,MySQL 是 autocommit 模式的,所有的數(shù)據(jù)庫更新操作都會即時(shí)提交醋奠,所以在缺省情況下榛臼,MySQL 是不支持事務(wù)的。
但是如果你的 MySQL 表類型是使用 InnoDB Tables 或 BDB tables 的話钝域,你的MySQL 就可以使用事務(wù)處理,使用 SETAUTOCOMMIT=0 就可以使 MySQL 允許在非 autocommit 模式讽坏,在非autocommit 模式下锭魔,你必須使用 COMMIT 來提交你的更改例证,或者用 ROLLBACK來回滾你的更改。
22迷捧、MySQL 里記錄貨幣用什么字段類型好
NUMERIC 和 DECIMAL 類型被 MySQL 實(shí)現(xiàn)為同樣的類型织咧,這在 SQL92 標(biāo)準(zhǔn)允許。
他們被用于保存值漠秋,該值的準(zhǔn)確精度是極其重要的值笙蒙,例如與金錢有關(guān)的數(shù)據(jù)。
當(dāng)聲明一個(gè)類是這些類型之一時(shí)庆锦,精度和規(guī)模的能被(并且通常是)指定捅位。
例如:
salary DECIMAL(9,2)
在這個(gè)例子中,9(precision)代表將被用于存儲值的總的小數(shù)位數(shù)搂抒,而 2(scale)代表將被用于存儲小數(shù)點(diǎn)后的位數(shù)艇搀。
因此,在這種情況下求晶,能被存儲在 salary 列中的值的范圍是從-9999999.99 到9999999.99焰雕。
23、MySQL 有關(guān)權(quán)限的表都有哪幾個(gè)芳杏?
MySQL 服務(wù)器通過權(quán)限表來控制用戶對數(shù)據(jù)庫的訪問矩屁,權(quán)限表存放在 MySQL 數(shù)據(jù)庫里,由 MySQL_install_db 腳本初始化爵赵。這些權(quán)限表分別 user吝秕,db,table_priv空幻,columns_priv 和 host郭膛。
24、列的字符串類型可以是什么氛悬?
字符串類型是:
1则剃、SET
2耘柱、BLOB
3、ENUM
4棍现、CHAR
5调煎、TEXT
25、MySQL 數(shù)據(jù)庫作發(fā)布系統(tǒng)的存儲己肮,一天五萬條以上的增量士袄,預(yù)計(jì)運(yùn)維三年,怎么優(yōu)化?
1谎僻、設(shè)計(jì)良好的數(shù)據(jù)庫結(jié)構(gòu)娄柳,允許部分?jǐn)?shù)據(jù)冗余,盡量避免 join 查詢艘绍,提高效率赤拒。
2、選擇合適的表字段數(shù)據(jù)類型和存儲引擎诱鞠,適當(dāng)?shù)奶砑铀饕?/p>
3挎挖、MySQL 庫主從讀寫分離。
4航夺、找規(guī)律分表蕉朵,減少單表中的數(shù)據(jù)量提高查詢速度。
5阳掐、添加緩存機(jī)制始衅,比如 memcached,apc 等缭保。
6汛闸、不經(jīng)常改動的頁面,生成靜態(tài)頁面涮俄。
7蛉拙、書寫高效率的 SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1,
field_2, field_3 FROM TABLE.
篇幅所限彻亲,本文就先寫到這了孕锄,后面還有25道經(jīng)典面試題,多提一嘴苞尝,刷題切記不能死記硬背畸肆,很多問題都可以聯(lián)合起來理解,學(xué)會舉一反三宙址,才能讓你事半功倍轴脐,祝兄弟們早日找到自己滿意的工作。sky~