其它MySQL 面試系列:
MySQL 面試系列:MySQL查詢?nèi)绾芜M(jìn)行優(yōu)化?
MySQL 面試系列:一條select語句在MySQL是這樣執(zhí)行的?
MySQL 面試系列:MySQL 常見的開放性問題
MySQL 面試系列:MySQL 性能優(yōu)化 & 分布式
MySQL 面試系列:MySQL 命令和內(nèi)置函數(shù)
MySQL 面試系列:MySQL 中日志的面試題總結(jié)
MySQL 面試系列:MySQL 中鎖的面試題總結(jié)
MySQL 面試系列:MySQL 事務(wù)的面試題總結(jié)
MySQL 面試系列:MySQL 索引的面試題總結(jié)
MySQL 面試系列:MySQL 基礎(chǔ)模塊的面試題總結(jié)
說一下 MySQL 執(zhí)行一條查詢語句的內(nèi)部執(zhí)行過程崇呵?
- 客戶端先通過連接器連接到 MySQL 服務(wù)器蚓挤。
- 連接器權(quán)限驗(yàn)證通過之后,先查詢是否有查詢緩存涛目,如果有緩存(之前執(zhí)行過此語句)則直接返回緩存數(shù)據(jù)联四,如果沒有緩存則進(jìn)入分析器。
- 分析器會(huì)對(duì)查詢語句進(jìn)行語法分析和詞法分析,判斷 SQL 語法是否正確,如果查詢語法錯(cuò)誤會(huì)直接返回給客戶端錯(cuò)誤信息正林,如果語法正確則進(jìn)入優(yōu)化器。
- 優(yōu)化器是對(duì)查詢語句進(jìn)行優(yōu)化處理颤殴,例如一個(gè)表里面有多個(gè)索引卓囚,優(yōu)化器會(huì)判別哪個(gè)索引性能更好。
- 優(yōu)化器執(zhí)行完就進(jìn)入執(zhí)行器诅病,執(zhí)行器就開始執(zhí)行語句進(jìn)行查詢比對(duì)了,直到查詢到滿足條件的所有數(shù)據(jù)粥烁,然后進(jìn)行返回贤笆。
MySQL 提示“不存在此列”是執(zhí)行到哪個(gè)節(jié)點(diǎn)報(bào)出的?
此錯(cuò)誤是執(zhí)行到分析器階段報(bào)出的讨阻,因?yàn)?MySQL 會(huì)在分析器階段檢查 SQL 語句的正確性芥永。
MySQL 查詢緩存的功能有何優(yōu)缺點(diǎn)?
MySQL 查詢緩存功能是在連接器之后發(fā)生的钝吮,它的優(yōu)點(diǎn)是效率高埋涧,如果已經(jīng)有緩存則會(huì)直接返回結(jié)果板辽。 查詢緩存的缺點(diǎn)是失效太頻繁導(dǎo)致緩存命中率比較低,任何更新表操作都會(huì)清空查詢緩存棘催,因此導(dǎo)致查詢緩存非常容易失效劲弦。
如何關(guān)閉 MySQL 的查詢緩存功能?
MySQL 查詢緩存默認(rèn)是開啟的醇坝,配置 querycachetype 參數(shù)為 DEMAND(按需使用)關(guān)閉查詢緩存邑跪,MySQL 8.0 之后直接刪除了查詢緩存的功能。
MySQL 的常用引擎都有哪些呼猪?
MySQL 的常用引擎有 InnoDB画畅、MyISAM、Memory 等宋距,從 MySQL 5.5.5 版本開始 InnoDB 就成為了默認(rèn)的存儲(chǔ)引擎轴踱。
MySQL 可以針對(duì)表級(jí)別設(shè)置數(shù)據(jù)庫引擎嗎?怎么設(shè)置谚赎?
可以針對(duì)不同的表設(shè)置不同的引擎淫僻。在 create table 語句中使用 engine=引擎名(比如Memory)來設(shè)置此表的存儲(chǔ)引擎。完整代碼如下:
create table student(
id int primary key auto_increment,
username varchar(120),
age int
) ENGINE=Memory
常用的存儲(chǔ)引擎 InnoDB 和 MyISAM 有什么區(qū)別沸版?
InnoDB 和 MyISAM 最大的區(qū)別是 InnoDB 支持事務(wù)嘁傀,而 MyISAM 不支持事務(wù),它們主要區(qū)別如下:
- InnoDB 支持崩潰后安全恢復(fù)视粮,MyISAM 不支持崩潰后安全恢復(fù)细办;
- InnoDB 支持行級(jí)鎖,MyISAM 不支持行級(jí)鎖蕾殴,只支持到表鎖笑撞;
- InnoDB 支持外鍵,MyISAM 不支持外鍵钓觉;
- MyISAM 性能比 InnoDB 高茴肥;
- MyISAM 支持 FULLTEXT 類型的全文索引,InnoDB 不支持 FULLTEXT 類型的全文索引荡灾,但是 InnoDB 可以使用 sphinx 插件支持全文索引瓤狐,并且效果更好;
- InnoDB 主鍵查詢性能高于 MyISAM批幌。
InnoDB 有哪些特性础锐?
1)插入緩沖(insert buffer):對(duì)于非聚集索引的插入和更新,不是每一次直接插入索引頁中荧缘,而是首先判斷插入的非聚集索引頁是否在緩沖池中皆警,如果在,則直接插入截粗,否則信姓,先放入一個(gè)插入緩沖區(qū)中鸵隧。好似欺騙數(shù)據(jù)庫這個(gè)非聚集的索引已經(jīng)插入到葉子節(jié)點(diǎn)了,然后再以一定的頻率執(zhí)行插入緩沖和非聚集索引頁子節(jié)點(diǎn)的合并操作意推,這時(shí)通常能將多個(gè)插入合并到一個(gè)操作中豆瘫,這就大大提高了對(duì)非聚集索引執(zhí)行插入和修改操作的性能。
2)兩次寫(double write):兩次寫給 InnoDB 帶來的是可靠性左痢,主要用來解決部分寫失敗(partial page write)靡羡。doublewrite 有兩部分組成,一部分是內(nèi)存中的 doublewrite buffer 俊性,大小為 2M略步,另外一部分就是物理磁盤上的共享表空間中連續(xù)的 128 個(gè)頁,即兩個(gè)區(qū)定页,大小同樣為 2M趟薄。當(dāng)緩沖池的作業(yè)刷新時(shí),并不直接寫硬盤典徊,而是通過 memcpy 函數(shù)將臟頁先拷貝到內(nèi)存中的 doublewrite buffer杭煎,之后通過 doublewrite buffer 再分兩次寫,每次寫入 1M 到共享表空間的物理磁盤上卒落,然后馬上調(diào)用 fsync 函數(shù)羡铲,同步磁盤。如下圖所示
3)自適應(yīng)哈希索引(adaptive hash index):由于 InnoDB 不支持 hash 索引儡毕,但在某些情況下 hash 索引的效率很高也切,于是出現(xiàn)了 adaptive hash index 功能, InnoDB 存儲(chǔ)引擎會(huì)監(jiān)控對(duì)表上索引的查找腰湾,如果觀察到建立 hash 索引可以提高性能的時(shí)候雷恃,則自動(dòng)建立 hash 索引。
一張自增表中有三條數(shù)據(jù)费坊,刪除了兩條數(shù)據(jù)之后重啟數(shù)據(jù)庫倒槐,再新增一條數(shù)據(jù),此時(shí)這條數(shù)據(jù)的 ID 是幾附井?
如果這張表的引擎是 MyISAM讨越,那么 ID=4,如果是 InnoDB 那么 ID=2(MySQL 8 之前的版本)永毅。
MySQL 中什么情況會(huì)導(dǎo)致自增主鍵不能連續(xù)谎痢?
以下情況會(huì)導(dǎo)致 MySQL 自增主鍵不能連續(xù):
- 唯一主鍵沖突會(huì)導(dǎo)致自增主鍵不連續(xù);
- 事務(wù)回滾也會(huì)導(dǎo)致自增主鍵不連續(xù)卷雕。
InnoDB 中自增主鍵能不能被持久化?
自增主鍵能不能被持久化票从,說的是 MySQL 重啟之后 InnoDB 能不能恢復(fù)重啟之前的自增列漫雕,InnoDB 在 8.0 之前是沒有持久化能力的滨嘱,但 MySQL 8.0 之后就把自增主鍵保存到 redo log(一種日志類型,下文會(huì)詳細(xì)講)中浸间,當(dāng) MySQL 重啟之后就會(huì)從 redo log 日志中恢復(fù)太雨。
什么是獨(dú)立表空間和共享表空間?它們的區(qū)別是什么魁蒜?
共享表空間:指的是數(shù)據(jù)庫的所有的表數(shù)據(jù)囊扳,索引文件全部放在一個(gè)文件中,默認(rèn)這個(gè)共享表空間的文件路徑在 data 目錄下兜看。 獨(dú)立表空間:每一個(gè)表都將會(huì)生成以獨(dú)立的文件方式來進(jìn)行存儲(chǔ)锥咸。 共享表空間和獨(dú)立表空間最大的區(qū)別是如果把表放再共享表空間,即使表刪除了空間也不會(huì)刪除细移,所以表依然很大搏予,而獨(dú)立表空間如果刪除表就會(huì)清除空間。
如何設(shè)置獨(dú)立表空間弧轧?
獨(dú)立表空間是由參數(shù) innodbfileper_table 控制的雪侥,把它設(shè)置成 ON 就是獨(dú)立表空間了,從 MySQL 5.6.6 版本之后精绎,這個(gè)值就默認(rèn)是 ON 了速缨。
如何進(jìn)行表空間收縮?
使用重建表的方式可以收縮表空間代乃,重建表有以下三種方式:
- alter table t engine=InnoDB
- optmize table t
- truncate table t
說一下重建表的執(zhí)行流程旬牲?
- 建立一個(gè)臨時(shí)文件,掃描表 t 主鍵的所有數(shù)據(jù)頁襟己;
- 用數(shù)據(jù)頁中表 t 的記錄生成 B+ 樹引谜,存儲(chǔ)到臨時(shí)文件中;
- 生成臨時(shí)文件的過程中擎浴,將所有對(duì) t 的操作記錄在一個(gè)日志文件(row log)中员咽;
- 臨時(shí)文件生成后,將日志文件中的操作應(yīng)用到臨時(shí)文件贮预,得到一個(gè)邏輯數(shù)據(jù)上與表 t相同的數(shù)據(jù)文件贝室;
- 用臨時(shí)文件替換表 t 的數(shù)據(jù)文件。