MySQL 執(zhí)行一條查詢語句的內(nèi)部執(zhí)行過程?1.客戶端先通過連接器連接到Mysql服務(wù)器。 2.連接器權(quán)限驗(yàn)證通過之后,先查詢是否有查詢緩存。若之前執(zhí)行過此語句有緩存,則直接返回緩存數(shù)據(jù),否則直接進(jìn)入分析器。 3.分析器會對查詢語句進(jìn)行語法分析和詞法分析,判斷SQL語法是否正確。如果查詢語法錯誤就直接返回錯誤信息給客戶端。若語法正確則進(jìn)入優(yōu)化器。 4.優(yōu)化器對查詢語句進(jìn)行優(yōu)化處理,例如一個表中包含多個索引,優(yōu)化器會判別哪個索引性能更好。 5.優(yōu)化器執(zhí)行完就進(jìn)入執(zhí)行器,執(zhí)行器就開始執(zhí)行語句進(jìn)行查詢比對,直到滿足條件的所有數(shù)據(jù)查詢完畢,然后返回?cái)?shù)據(jù)。 MySQL 提示“不存在此列”是執(zhí)行到哪個節(jié)點(diǎn)報(bào)出的?此錯誤是執(zhí)行到分析器階段,因?yàn)镸ysql在此階段會檢查SQL語句的正確性。 MySQL 查詢緩存的功能有何優(yōu)缺點(diǎn)?MySQL查詢緩存功能是在連接器鏈接MySQL服務(wù)器之后發(fā)生的。 優(yōu)點(diǎn):效率高,如果有緩存則直接返回緩存數(shù)據(jù)。 缺點(diǎn):失效太頻繁導(dǎo)致緩存命中率比較低,任何更新表操作都會清空查詢緩存,因此導(dǎo)致查詢緩存非常容易失效。 如何關(guān)閉 MySQL 的查詢緩存功能?MySQL 查詢緩存默認(rèn)是開啟的,配置 querycachetype 參數(shù)為 DEMAND(按需使用)關(guān)閉查詢緩存。 MySQL 8.0 之后直接刪除了查詢緩存的功能。 MySQL 可以針對表級別設(shè)置數(shù)據(jù)庫引擎嗎?怎么設(shè)置?可以針對不同的表設(shè)置不同的引擎。在 create table 語句中使用 engine=引擎名(比如Memory)來設(shè)置此表的存儲引擎。 完整代碼如下: create table student( id int primary key auto_increment, username varchar(120), age int ) ENGINE=Memory MySQL 的常用引擎都有哪些?MySQL 的常用引擎有 InnoDB、MyISAM、Memory 等。 MySQL 5.5.5 版本開始 InnoDB 就成為了默認(rèn)的存儲引擎 常用的存儲引擎 InnoDB 和 MyISAM 有什么區(qū)別?InnoDB 和 MyISAM 最大的區(qū)別是InnoDB 支持事務(wù),而 MyISAM 不支持事務(wù)。 主要區(qū)別: 1.InnoDB 支持崩潰后安全恢復(fù),MyISAM 不支持崩潰后安全恢復(fù)。 2.InnoDB 支持行級鎖,MyISAM 不支持行級鎖,只支持到表鎖。 3.InnoDB 支持外鍵,MyISAM 不支持外鍵。 4.MyISAM 性能比 InnoDB 高。 5.MyISAM 支持 FULLTEXT 類型的全文索引,InnoDB 不支持 FULLTEXT 類型的全文索引,但是 InnoDB 可以使用 sphinx 插件支持全文索引,并且效果更好。 6.InnoDB 主鍵查詢性能高于 MyISAM。 InnoDB 有哪些特性?1.插入緩沖(insert buffer):對于非聚集索引的插入和更新,不是每一次直接插入索引頁中,而是首先判斷插入的非聚集索引頁是否在緩沖池中,如果在,則直接插入,否則,先放入一個插入緩沖區(qū)中。好似欺騙數(shù)據(jù)庫這個非聚集的索引已經(jīng)插入到葉子節(jié)點(diǎn)了,然后再以一定的頻率執(zhí)行插入緩沖和非聚集索引頁子節(jié)點(diǎn)的合并操作,這時通常能將多個插入合并到一個操作中,這就大大提高了對非聚集索引執(zhí)行插入和修改操作的性能。 2.兩次寫(double write):兩次寫給 InnoDB 帶來的是可靠性,主要用來解決部分寫失敗(partial page write)。doublewrite 有兩部分組成,一部分是內(nèi)存中的 doublewrite buffer ,大小為 2M,另外一部分就是物理磁盤上的共享表空間中連續(xù)的 128 個頁,即兩個區(qū),大小同樣為 2M。當(dāng)緩沖池的作業(yè)刷新時,并不直接寫硬盤,而是通過 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 存儲引擎會監(jiān)控對表上索引的查找,如果觀察到建立 hash 索引可以提高性能的時候,則自動建立 hash 索引。 一張自增表中有三條數(shù)據(jù),刪除了兩條數(shù)據(jù)之后重啟數(shù)據(jù)庫,再新增一條數(shù)據(jù),此時這條數(shù)據(jù)的 ID 是幾?如果這張表的引擎是 MyISAM,那么 ID=4,如果是 InnoDB 那么 ID=2(MySQL 8 之前的版本)。 MySQL 中什么情況會導(dǎo)致自增主鍵不能連續(xù)?以下情況會導(dǎo)致 MySQL 自增主鍵不能連續(xù): 唯一主鍵沖突會導(dǎo)致自增主鍵不連續(xù) 事務(wù)回滾也會導(dǎo)致自增主鍵不連續(xù) 來源:https://www./content-2-472051.html |
|