開(kāi)篇介紹
大家好,我是Java最全面試題庫(kù)
的提褲姐,今天這篇是數(shù)據(jù)庫(kù)面試題系列的第一篇,主要總結(jié)了MySQL相關(guān)的面試題;在后續(xù),會(huì)沿著第一篇開(kāi)篇的知識(shí)線路一直總結(jié)下去,做到日更!如果我能做到百日百更,希望你也可以跟著百日百刷,一百天養(yǎng)成一個(gè)好習(xí)慣。
SQL 的 select 語(yǔ)句完整的執(zhí)行順序?
1、from 子句組裝來(lái)自不同數(shù)據(jù)源的數(shù)據(jù);
2、where 子句基于指定的條件對(duì)記錄行進(jìn)行篩選;
3、group by 子句將數(shù)據(jù)劃分為多個(gè)分組;
4、使用聚集函數(shù)進(jìn)行計(jì)算;
5、使用 having 子句篩選分組;
6、計(jì)算所有的表達(dá)式;
7、select 的字段;
8、使用 order by 對(duì)結(jié)果集進(jìn)行排序。
左連接和右連接的區(qū)別?
外連接:
- 左連接(左外連接):以左表作為基準(zhǔn)進(jìn)行查詢(xún),左表數(shù)據(jù)會(huì)全部顯示出來(lái),右表如果和左表匹配的
數(shù)據(jù)則顯示相應(yīng)字段的數(shù)據(jù),如果不匹配則顯示為 null。 - 右連接(右外連接):以右表作為基準(zhǔn)進(jìn)行查詢(xún),右表數(shù)據(jù)會(huì)全部顯示出來(lái),左表如果和右表匹配的
數(shù)據(jù)則顯示相應(yīng)字段的數(shù)據(jù),如果不匹配則顯示為 null。
全連接:
先以左表進(jìn)行左外連接,再以右表進(jìn)行右外連接
內(nèi)連接:
顯示表之間有連接匹配的所有行。
什么是sql注入?如何防止sql注入?
sql注入
通過(guò)在 Web 表單中輸入(惡意)SQL 語(yǔ)句得到一個(gè)存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫(kù),而不是按照設(shè)計(jì)者意圖去執(zhí)行 SQL 語(yǔ)句。
舉例:當(dāng)執(zhí)行的 sql 為 select * from user where username = "admin" or "a"="a"
時(shí),sql 語(yǔ)句恒成立,參數(shù) admin 毫無(wú)意義。
防止 sql 注入的方式:
- 預(yù)編譯語(yǔ)句:如,select * from user where username = ?,sql 語(yǔ)句語(yǔ)義不會(huì)發(fā)生改變,sql 語(yǔ)句中變量用?表示,即使傳遞參數(shù)時(shí)為"admin or 'a'= 'a'",也會(huì)把這整體當(dāng)做一個(gè)字符創(chuàng)去查詢(xún)。
- Mybatis 框架中的 mapper 方式中的 # 也能很大程度的防止 sql 注入($無(wú)法防止 sql 注入)。
有哪些sql優(yōu)化方法?
1、當(dāng)只要一行數(shù)據(jù)時(shí)使用 limit 1
查詢(xún)時(shí)如果已知會(huì)得到一條數(shù)據(jù),這種情況下加上 limit 1 會(huì)增加性能。因?yàn)?mysql 數(shù)據(jù)庫(kù)引擎會(huì)在找到一條結(jié)果停止搜索,而不是繼續(xù)查詢(xún)下一條是否符合標(biāo)準(zhǔn)直到所有記錄查詢(xún)完畢。
2、選擇正確的數(shù)據(jù)庫(kù)引擎
Mysql 中有兩個(gè)引擎 MyISAM
和 InnoDB
,每個(gè)引擎有利有弊。
①M(fèi)yISAM 適用于一些大量查詢(xún)的應(yīng)用,但對(duì)于有大量寫(xiě)功能的應(yīng)用不是很好。甚至你只需要update 一個(gè)字段整個(gè)表都會(huì)被鎖起來(lái)。而別的進(jìn)程就算是讀操作也不行要等到當(dāng)前 update 操作完成之后才能繼續(xù)進(jìn)行。另外,MyISAM 對(duì)于 select count(*)這類(lèi)操作是超級(jí)快的。
②InnoDB 的趨勢(shì)會(huì)是一個(gè)非常復(fù)雜的存儲(chǔ)引擎,對(duì)于一些小的應(yīng)用會(huì)比 MyISAM 還慢,但是支持“行鎖”,所以在寫(xiě)操作比較多的時(shí)候會(huì)比較優(yōu)秀。并且,它支持很多的高級(jí)應(yīng)用,例如:事務(wù)。
用
not exists
代替not in
Not exists 用到了連接能夠發(fā)揮已經(jīng)建立好的索引的作用,not in 不能使用索引。Not in 是最慢的方式要同每條記錄比較,在數(shù)據(jù)量比較大的操作時(shí)不建議使用這種方式。對(duì)操作符的優(yōu)化,盡量不采用不利于索引的操作符
如:in not in is null is not null <>
等
某個(gè)字段總要拿來(lái)搜索,為其建立索引:
Mysql 中使用 alter table 語(yǔ)句來(lái)為表中的字段添加索引:alter table 表明 add index (字段名)
;
Mysql 存儲(chǔ)引擎有哪些?
1.InnoDB 存儲(chǔ)引擎
InnoDB 是事務(wù)型數(shù)據(jù)庫(kù)的首選引擎,支持事務(wù)安全表(ACID),支持行鎖定和外鍵,InnoDB 是默認(rèn)的MySQL引擎。
2.MyISAM 存儲(chǔ)引擎
MyISAM 基于 ISAM 存儲(chǔ)引擎,并對(duì)其進(jìn)行擴(kuò)展。它是在 Web、數(shù)據(jù)倉(cāng)儲(chǔ)和其他應(yīng)用環(huán)境下最常使用的存儲(chǔ)引擎之一。MyISAM 擁有較高的插入、查詢(xún)速度,但不支持事物。
3.MEMORY 存儲(chǔ)引擎
MEMORY 存儲(chǔ)引擎將表中的數(shù)據(jù)存儲(chǔ)到內(nèi)存中,未查詢(xún)和引用其他表數(shù)據(jù)提供快速訪問(wèn)。
4.NDB 存儲(chǔ)引擎
DB 存儲(chǔ)引擎是一個(gè)集群存儲(chǔ)引擎,類(lèi)似于 Oracle 的 RAC,但它是 Share Nothing 的架構(gòu),因此能提供更高級(jí)別的高可用性和可擴(kuò)展性。NDB 的特點(diǎn)是數(shù)據(jù)全部放在內(nèi)存中,因此通過(guò)主鍵查找非常快。
關(guān)于 NDB,有一個(gè)問(wèn)題需要注意,它的連接(join)操作是在 MySQL 數(shù)據(jù)庫(kù)層完成,不是在存儲(chǔ)引擎層完成,這意味著,復(fù)雜的 join 操作需要巨大的網(wǎng)絡(luò)開(kāi)銷(xiāo),查詢(xún)速度會(huì)很慢。
5.Memory (Heap) 存儲(chǔ)引擎
Memory 存儲(chǔ)引擎(之前稱(chēng)為 Heap)將表中數(shù)據(jù)存放在內(nèi)存中,如果數(shù)據(jù)庫(kù)重啟或崩潰,數(shù)據(jù)丟失,因此它非常適合存儲(chǔ)臨時(shí)數(shù)據(jù)。
6.Archive 存儲(chǔ)引擎
正如其名稱(chēng)所示,Archive 非常適合存儲(chǔ)歸檔數(shù)據(jù),如日志信息。它只支持 INSERT 和 SELECT 操作,其設(shè)計(jì)的主要目的是提供高速的插入和壓縮功能。
7.Federated 存儲(chǔ)引擎
Federated 存儲(chǔ)引擎不存放數(shù)據(jù),它至少指向一臺(tái)遠(yuǎn)程 MySQL 數(shù)據(jù)庫(kù)服務(wù)器上的表,非常類(lèi)似于 Oracle 的透明網(wǎng)關(guān)。
8.Maria 存儲(chǔ)引擎
Maria 存儲(chǔ)引擎是新開(kāi)發(fā)的引擎,其設(shè)計(jì)目標(biāo)是用來(lái)取代原有的 MyISAM 存儲(chǔ)引擎,從而成為 MySQL 默認(rèn)
的存儲(chǔ)引擎。
上述引擎中,InnoDB 是事務(wù)安全的存儲(chǔ)引擎,設(shè)計(jì)上借鑒了很多 Oracle 的架構(gòu)思想,一般而言,在 OLTP
應(yīng)用中,InnoDB 應(yīng)該作為核心應(yīng)用表的首先存儲(chǔ)引擎。InnoDB 是由第三方的 Innobase Oy 公司開(kāi)發(fā),現(xiàn)已被Oracle 收購(gòu),創(chuàng)始人是 Heikki Tuuri,芬蘭赫爾辛基人,和著名的 Linux 創(chuàng)始人 Linus 是校友。
事務(wù)的四大特征是什么?
數(shù)據(jù)庫(kù)事務(wù) transanction 正確執(zhí)行的四個(gè)基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、持久性(Durability)。
原子性
:整個(gè)事務(wù)中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)
行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被回滾(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。
一致性
:在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞。
隔離性
:隔離狀態(tài)執(zhí)行事務(wù),使它們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作。如果有兩個(gè)事務(wù),運(yùn)行在相
同的時(shí)間內(nèi),執(zhí)行 相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)。這種屬性有時(shí)稱(chēng)為串行化,為了防止事務(wù)操作間的混淆, 必須串行化或序列化請(qǐng) 求,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)。
持久性
:在事務(wù)完成以后,該事務(wù)所對(duì)數(shù)據(jù)庫(kù)所作的更改便持久的保存在數(shù)據(jù)庫(kù)之中,并不會(huì)被回滾。
MySQL 索引的“使用”注意事項(xiàng)
1.避免在 WHERE 子句中使用!=
或<>
操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。優(yōu)化器將無(wú)法通過(guò)索引來(lái)確定將要命中的行數(shù),因此需要搜索該表的所有行。
2.避免在 WHERE 子句中使用 OR 來(lái)連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:SELECT id FROM t WHERE num = 10 OR num = 20
。
3.避免在 WHERE 子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。
4.避免在 WHERE 子句中對(duì)字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。
5.LIKE 查詢(xún),%
不能在前,因?yàn)闊o(wú)法使用索引。如果需要模糊匹配,可以使用全文索引。
為什么mysql建議使用自增主鍵?
1、如果我們定義了主鍵(PRIMARY KEY),那么InnoDB會(huì)選擇主鍵作為聚集索引。
如果沒(méi)有顯式定義主鍵,則InnoDB會(huì)選擇第一個(gè)不包含有NULL值的唯一索引作為主鍵索引。
如果也沒(méi)有這樣的唯一索引,則InnoDB會(huì)選擇內(nèi)置6字節(jié)長(zhǎng)的ROWID作為隱含的聚集索引(ROWID隨著行記錄的寫(xiě)入而主鍵遞增,這個(gè)ROWID不像ORACLE的ROWID那樣可引用,是隱含的)。
2、數(shù)據(jù)記錄本身被存于主索引(一顆B+Tree)的葉子節(jié)點(diǎn)上,這就要求同一個(gè)葉子節(jié)點(diǎn)內(nèi)(大小為一個(gè)內(nèi)存頁(yè)或磁盤(pán)頁(yè))的各條數(shù)據(jù)記錄按主鍵順序存放。
因此每當(dāng)有一條新的記錄插入時(shí),MySQL會(huì)根據(jù)其主鍵將其插入適當(dāng)?shù)墓?jié)點(diǎn)和位置,如果頁(yè)面達(dá)到裝載因子(InnoDB默認(rèn)為15/16),則開(kāi)辟一個(gè)新的頁(yè)(節(jié)點(diǎn))
3、如果表使用自增主鍵,那么每次插入新的記錄,記錄就會(huì)順序添加到當(dāng)前索引節(jié)點(diǎn)的后續(xù)位置,當(dāng)一頁(yè)寫(xiě)滿(mǎn),就會(huì)自動(dòng)開(kāi)辟一個(gè)新的頁(yè)。
4、如果使用非自增主鍵(如果身份證號(hào)或?qū)W號(hào)等),由于每次插入主鍵的值近似于隨機(jī),因此每次新紀(jì)錄都要被插到現(xiàn)有索引頁(yè)得中間某個(gè)位置,此時(shí)MySQL不得不為了將新記錄插到合適位置而移動(dòng)數(shù)據(jù),甚至目標(biāo)頁(yè)面可能已經(jīng)被回寫(xiě)到磁盤(pán)上而從緩存中清掉,此時(shí)又要從磁盤(pán)上讀回來(lái),這增加了很多開(kāi)銷(xiāo),同時(shí)頻繁的移動(dòng)、分頁(yè)操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu),后續(xù)不得不通過(guò)OPTIMIZE TABLE
來(lái)重建表并優(yōu)化填充頁(yè)面。
mysql rr級(jí)別如何解決幻讀問(wèn)題?
該隔離級(jí)別是 MySQL 默認(rèn)的隔離級(jí)別
,在同一個(gè)事務(wù)里,select 的結(jié)果是事務(wù)開(kāi)始時(shí)時(shí)間點(diǎn)的狀態(tài),因此,同樣的 select 操作讀到的結(jié)果會(huì)是一致的,但是,會(huì)有幻讀現(xiàn)象。
MySQL 的 InnoDB 引擎可以通過(guò) next-key locks
機(jī)制來(lái)避免幻讀。 InnoDB 存儲(chǔ)引擎使用三種行鎖的算法用來(lái)滿(mǎn)足相關(guān)事務(wù)隔離級(jí)別的要求:
Record Locks
該鎖為索引記錄上的鎖,如果表中沒(méi)有定義索引,InnoDB 會(huì)默認(rèn)為該表創(chuàng)建一個(gè)隱藏的聚簇索引,并使用該索引鎖定記錄。
Gap Locks
該鎖會(huì)鎖定一個(gè)范圍,但是不括記錄本身。可以通過(guò)修改隔離級(jí)別為 READ COMMITTED
或者配置 innodb_locks_unsafe_for_binlog
參數(shù)為 ON
。
Next-key Locks
該鎖就是 Record Locks
和 Gap Locks
的組合,即鎖定一個(gè)范圍并且鎖定該記錄本身。InnoDB 使用 Next-key Locks
解決幻讀問(wèn)題。需要注意的是,如果索引有唯一屬性,則 InnnoDB 會(huì)自動(dòng)將 Next-key Locks 降級(jí)為 Record Locks。
舉例:如果一個(gè)索引有 1, 3, 5 三個(gè)值,則該索引鎖定的區(qū)間為 (-∞,1], (1,3], (3,5], (5,+ ∞)。
MySQL 主從復(fù)制的流程是怎么樣的?
1、Master 上面的 binlog dump
線程,該線程負(fù)責(zé)將 master 的 binlog event
傳到 slave
。
2、Slave 上面的 IO 線程,該線程負(fù)責(zé)接收 Master 傳過(guò)來(lái)的 binlog,并寫(xiě)入 relay log
。
3、Slave 上面的 SQL 線程,該線程負(fù)責(zé)讀取 relay log
并執(zhí)行。
4、如果是多線程復(fù)制,無(wú)論是 5.6 庫(kù)級(jí)別的假多線程還是 MariaDB 或者 5.7 的真正的多線程復(fù)制, SQL 線程只做 coordinator ,只負(fù)責(zé)把 relay log
中的 binlog
讀出來(lái)然后交給 worker
線程, woker 線程負(fù)責(zé)具體 binlog event
的執(zhí)行。
Mysql 中 MyISAM 和 InnoDB 的區(qū)別有哪些?
1、InnoDB支持事務(wù)
,MyISAM不支持
對(duì)于InnoDB每一條SQL語(yǔ)言都默認(rèn)封裝成事務(wù),自動(dòng)提交,這樣會(huì)影響速度,所以最好把多條SQL語(yǔ)言放在begin和commit之間,組成一個(gè)事務(wù);
2、InnoDB支持外鍵
,而MyISAM不支持。對(duì)一個(gè)包含外鍵的InnoDB表轉(zhuǎn)為MYISAM會(huì)失敗;
3、InnoDB是聚集索引
,數(shù)據(jù)文件是和索引綁在一起的,必須要有主鍵,通過(guò)主鍵索引效率很高。
但是輔助索引需要兩次查詢(xún),先查詢(xún)到主鍵,然后再通過(guò)主鍵查詢(xún)到數(shù)據(jù)。因此主鍵不應(yīng)該過(guò)大,因?yàn)橹麈I太大,其他索引也都會(huì)很大。
而MyISAM是非聚集索引,數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨(dú)立的。
4、InnoDB不保存表的具體行數(shù),執(zhí)行select count(*) from table
時(shí)需要全表掃描。而MyISAM用一個(gè)變量保存了整個(gè)表的行數(shù),執(zhí)行上述語(yǔ)句時(shí)只需要讀出該變量即可,速度很快;
5、Innodb不支持全文索引
,而MyISAM支持全文索引
,查詢(xún)效率上MyISAM要高;
mysql事務(wù)隔離級(jí)別?
Read Uncommitted(讀取未提交內(nèi)容)
在該隔離級(jí)別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級(jí)別很少用于實(shí)際應(yīng)用,因?yàn)樗男阅芤膊槐绕渌?jí)別好多少。讀取未提交的數(shù)據(jù),也被稱(chēng)之為臟讀(Dirty Read)。
Read Committed(讀取提交內(nèi)容)
這是大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別(但不是MySQL默認(rèn)的)。它滿(mǎn)足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看見(jiàn)已經(jīng)提交事務(wù)所做的改變。這種隔離級(jí)別 也支持所謂的不可重復(fù)讀(Nonrepeatable Read),因?yàn)橥皇聞?wù)的其他實(shí)例在該實(shí)例處理其間可能會(huì)有新的commit,所以同一select可能返回不同結(jié)果。
Repeatable Read(可重讀)
這是MySQL的默認(rèn)事務(wù)隔離級(jí)別,它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)看到同樣的數(shù)據(jù)行。不過(guò)理論上,這會(huì)導(dǎo)致另一個(gè)棘手的問(wèn)題:幻讀 (Phantom Read)。簡(jiǎn)單的說(shuō),幻讀指當(dāng)用戶(hù)讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶(hù)再讀取該范圍的數(shù)據(jù)行時(shí),會(huì)發(fā)現(xiàn)有新的“幻影” 行。
InnoDB和Falcon存儲(chǔ)引擎通過(guò)多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問(wèn)題。
Serializable(可串行化)
這是最高的隔離級(jí)別,它通過(guò)強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問(wèn)題。簡(jiǎn)言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)。
MVCC流程?
mvcc根據(jù)undo log來(lái)實(shí)現(xiàn)
RR級(jí)別下,事務(wù)中的第一個(gè)SELECT
請(qǐng)求才開(kāi)始創(chuàng)建read view
;
RC級(jí)別下,事務(wù)中每次SELECT
請(qǐng)求都會(huì)重新創(chuàng)建read view
;
ReadView 中是當(dāng)前活躍的事務(wù) ID 列表,稱(chēng)之為 m_ids
,其中最小值為 up_limit_id
,最大值為 low_limit_id
,事務(wù) ID 是事務(wù)開(kāi)啟時(shí) InnoDB 分配的,其大小決定了事務(wù)開(kāi)啟的先后順序,因此我們可以通過(guò) ID 的大小關(guān)系來(lái)決定版本記錄的可見(jiàn)性,具體判斷流程如下:
如果被訪問(wèn)版本的
trx_id 小于 m_ids 中的最小值 up_limit_id
,說(shuō)明生成該版本的事務(wù)在 ReadView 生成前就已經(jīng)提交了,所以該版本可以被當(dāng)前事務(wù)訪問(wèn)。如果被訪問(wèn)版本的
trx_id 大于 m_ids 列表中的最大值 low_limit_id
,說(shuō)明生成該版本的事務(wù)在生成 ReadView 后才生成,所以該版本不可以被當(dāng)前事務(wù)訪問(wèn)。需要根據(jù) Undo Log 鏈找到前一個(gè)版本,然后根據(jù)該版本的 DB_TRX_ID 重新判斷可見(jiàn)性。如果被訪問(wèn)版本的
trx_id 屬性值在 m_ids 列表中最大值和最小值之間(包含)
,那就需要判斷一下 trx_id 的值是不是在 m_ids 列表中。如果在,說(shuō)明創(chuàng)建 ReadView 時(shí)生成該版本所屬事務(wù)還是活躍的,因此該版本不可以被訪問(wèn),需要查找 Undo Log 鏈得到上一個(gè)版本,然后根據(jù)該版本的 DB_TRX_ID 再?gòu)念^計(jì)算一次可見(jiàn)性;如果不在,說(shuō)明創(chuàng)建 ReadView 時(shí)生成該版本的事務(wù)已經(jīng)被提交,該版本可以被訪問(wèn)。
此時(shí)經(jīng)過(guò)一系列判斷我們已經(jīng)得到了這條記錄相對(duì) ReadView 來(lái)說(shuō)的可見(jiàn)結(jié)果。此時(shí),如果這條記錄的 delete_flag 為 true,說(shuō)明這條記錄已被刪除,不返回。否則說(shuō)明此記錄可以安全返回給客戶(hù)端。
mysql什么時(shí)候會(huì)出現(xiàn)數(shù)據(jù)頁(yè)預(yù)讀?
1、有一個(gè)參數(shù)是innodb_read_ahead_threshold
,他的默認(rèn)值是56
,意思就是如果順序的訪問(wèn)了一個(gè)區(qū)里的多個(gè)數(shù)據(jù)頁(yè),訪問(wèn)的數(shù)據(jù)頁(yè)的數(shù)量超過(guò)了這個(gè)閾值,此時(shí)就會(huì)觸發(fā)預(yù)讀機(jī)制,把下一個(gè)相鄰區(qū)中的所有數(shù)據(jù)頁(yè)都加載到緩存里去
2、如果Buffer Pool里緩存了一個(gè)區(qū)里的13個(gè)連續(xù)的數(shù)據(jù)頁(yè),而且這些數(shù)據(jù)頁(yè)都是比較頻繁會(huì)被訪問(wèn)的,此時(shí)就會(huì) 直接觸發(fā)預(yù)讀機(jī)制,把這個(gè)區(qū)里的其他的數(shù)據(jù)頁(yè)都加載到緩存里去 這個(gè)機(jī)制是通過(guò)參數(shù)innodb_random_read_ahead
來(lái)控制的,他默認(rèn)是OFF,也就是這個(gè)規(guī)則是關(guān)閉的
3、全表掃描
mysql有哪些binlog錄入格式?
statement
,statement模式下,記錄單元為語(yǔ)句。即每一個(gè)sql造成的影響會(huì)記錄。由于sql的執(zhí)行是有上下文的,因此在保存的時(shí)候需要保存相關(guān)的信息,同時(shí)還有一些使用了函數(shù)之類(lèi)的語(yǔ)句無(wú)法被記錄復(fù)制。row
,row級(jí)別下,記錄單元為每一行的改動(dòng),基本是可以全部記下來(lái)但是由于很多操作,會(huì)導(dǎo)致大量行的改動(dòng)(比如alter table),因此這種模式的文件保存的信息太多,日志量太大。mixed
,一種折中的方案,普通操作使用statement記錄,當(dāng)無(wú)法使用statement的時(shí)候使用row。