[TOC]
1. mysql的復(fù)制原理以及流程

- 第一步Master記錄二進(jìn)制日志, 每次提交事務(wù)完成數(shù)據(jù)更新前,Master將數(shù)據(jù)更新的時(shí)間記錄到二進(jìn)制日志中,MySql會(huì)按事務(wù)提交的順序而非每條語(yǔ)句的執(zhí)行順序來(lái)記錄二進(jìn)制日志。再記錄二進(jìn)制日志后,主庫(kù)會(huì)告訴存儲(chǔ)引擎可以提交事務(wù)了。
- 第二步,Slave將Master的二進(jìn)制日志復(fù)制到本地的中繼日志中,首先,Slave會(huì)啟動(dòng)一個(gè)工作線程,成為I/O線程, I/O線程跟Master建立一個(gè)普通的客戶端鏈接,然后再M(fèi)aster上啟動(dòng)一個(gè)特殊的二進(jìn)制轉(zhuǎn)儲(chǔ)(binlog dump)線程(該線程沒(méi)有對(duì)應(yīng)的SQL命令),這個(gè)二進(jìn)制轉(zhuǎn)儲(chǔ)線程會(huì)讀取主庫(kù)上的二進(jìn)制日志中的事件。從庫(kù)I/O線程將接受到時(shí)間記錄到中繼日志中。
- 第三步從庫(kù)的SQL線程執(zhí)行最后異步,該線程的從中繼日志中讀取事件并在從庫(kù)執(zhí)行,從而實(shí)現(xiàn)從庫(kù)數(shù)據(jù)更新
復(fù)制的類(lèi)型
1、基于語(yǔ)句的復(fù)制
在Master上執(zhí)行的SQL語(yǔ)句,在Slave上執(zhí)行同樣的語(yǔ)句。MySQL默認(rèn)采用基于語(yǔ)句的復(fù)制,效率比較高。一旦發(fā)現(xiàn)沒(méi)法精確復(fù)制時(shí),會(huì)自動(dòng)選著基于行的復(fù)制
2、基于行的復(fù)制
把改變的內(nèi)容復(fù)制到Slave,而不是把命令在Slave上執(zhí)行一遍。從MySQL5.0開(kāi)始支持
3、混合類(lèi)型的復(fù)制
默認(rèn)采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句的無(wú)法精確的復(fù)制時(shí),就會(huì)采用基于行的復(fù)制
相應(yīng)地,binlog的格式也有三種:STATEMENT,ROW,MIXED。
2. MySQL中myisam與innodb的區(qū)別
先看下《高性能MySQL》中對(duì)于他們的評(píng)價(jià):
InnoDB:MySQL默認(rèn)的事務(wù)型引擎,也是最重要和使用最廣泛的存儲(chǔ)引擎。它被設(shè)計(jì)成為大量的短期事務(wù),短期事務(wù)大部分情況下是正常提交的,很少被回滾。InnoDB的性能與自動(dòng)崩潰恢復(fù)的特性,使得它在非事務(wù)存儲(chǔ)需求中也很流行。除非有非常特別的原因需要使用其他的存儲(chǔ)引擎,否則應(yīng)該優(yōu)先考慮InnoDB引擎。
MyISAM:在MySQL 5.1 及之前的版本,MyISAM是默認(rèn)引擎。MyISAM提供的大量的特性,包括全文索引、壓縮、空間函數(shù)(GIS)等,但MyISAM并不支持事務(wù)以及行級(jí)鎖,而且一個(gè)毫無(wú)疑問(wèn)的缺陷是崩潰后無(wú)法安全恢復(fù)。正是由于MyISAM引擎的緣故,即使MySQL支持事務(wù)已經(jīng)很長(zhǎng)時(shí)間了,在很多人的概念中MySQL還是非事務(wù)型數(shù)據(jù)庫(kù)。盡管這樣,它并不是一無(wú)是處的。對(duì)于只讀的數(shù)據(jù),或者表比較小,可以忍受修復(fù)操作,則依然可以使用MyISAM(但請(qǐng)不要默認(rèn)使用MyISAM,而是應(yīng)該默認(rèn)使用InnoDB)
MySQL存儲(chǔ)引擎--MyISAM與InnoDB區(qū)別
1、 存儲(chǔ)結(jié)構(gòu)
MyISAM:每個(gè)MyISAM在磁盤(pán)上存儲(chǔ)成三個(gè)文件。分別為:表定義文件、數(shù)據(jù)文件、索引文件。第一個(gè)文件的名字以表的名字開(kāi)始,擴(kuò)展名指出文件類(lèi)型。.frm文件存儲(chǔ)表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。索引文件的擴(kuò)展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一個(gè)數(shù)據(jù)文件中(也可能是多個(gè)文件,或者是獨(dú)立的表空間文件),InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。
2、 存儲(chǔ)空間
MyISAM: MyISAM支持支持三種不同的存儲(chǔ)格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格,會(huì)被去掉)、動(dòng)態(tài)表、壓縮表。當(dāng)表在創(chuàng)建之后并導(dǎo)入數(shù)據(jù)之后,不會(huì)再進(jìn)行修改操作,可以使用壓縮表,極大的減少磁盤(pán)的空間占用。
InnoDB: 需要更多的內(nèi)存和存儲(chǔ),它會(huì)在主內(nèi)存中建立其專(zhuān)用的緩沖池用于高速緩沖數(shù)據(jù)和索引。
3、 可移植性、備份及恢復(fù)
MyISAM:數(shù)據(jù)是以文件的形式存儲(chǔ),所以在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中會(huì)很方便。在備份和恢復(fù)時(shí)可單獨(dú)針對(duì)某個(gè)表進(jìn)行操作。
InnoDB:免費(fèi)的方案可以是拷貝數(shù)據(jù)文件、備份 binlog,或者用 mysqldump,在數(shù)據(jù)量達(dá)到幾十G的時(shí)候就相對(duì)痛苦了。
4、 事務(wù)支持
MyISAM:強(qiáng)調(diào)的是性能,每次查詢(xún)具有原子性,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快,但是不提供事務(wù)支持。
InnoDB:提供事務(wù)支持事務(wù),外部鍵等高級(jí)數(shù)據(jù)庫(kù)功能。 具有事務(wù)(commit)、回滾(rollback)和崩潰修復(fù)能力(crash recovery capabilities)的事務(wù)安全(transaction-safe (ACID compliant))型表。
5、 AUTO_INCREMENT
MyISAM:可以和其他字段一起建立聯(lián)合索引。引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引,自動(dòng)增長(zhǎng)可以不是第一列,他可以根據(jù)前面幾列進(jìn)行排序后遞增。
InnoDB:InnoDB中必須包含只有該字段的索引。引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引也必須是組合索引的第一列。
6、 表鎖差異
MyISAM: 只支持表級(jí)鎖,用戶在操作myisam表時(shí),select,update,delete,insert語(yǔ)句都會(huì)給表自動(dòng)加鎖,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)。
InnoDB: 支持事務(wù)和行級(jí)鎖,是innodb的最大特色。行鎖大幅度提高了多用戶并發(fā)操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會(huì)鎖全表的。
7、 全文索引
MyISAM:支持 FULLTEXT類(lèi)型的全文索引
InnoDB:不支持FULLTEXT類(lèi)型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
8、表主鍵
MyISAM:允許沒(méi)有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB:如果沒(méi)有設(shè)定主鍵或者非空唯一索引,就會(huì)自動(dòng)生成一個(gè)6字節(jié)的主鍵(用戶不可見(jiàn)),數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。
9、表的具體行數(shù)
MyISAM: 保存有表的總行數(shù),如果select count() from table;會(huì)直接取出出該值。
InnoDB: 沒(méi)有保存表的總行數(shù),如果使用select count(*) from table;就會(huì)遍歷整個(gè)表,消耗相當(dāng)大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。
10、CRUD操作
MyISAM:如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。
InnoDB:如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表。
11、 外鍵
MyISAM:不支持
InnoDB:支持
innodb引擎的4大特性
插入緩沖 Insert Buffer 對(duì)于非聚集類(lèi)索引的插入和更新操作,不是每一次都直接插入到索引頁(yè)中,而是先插入到內(nèi)存中。具體做法是:如果該索引頁(yè)在緩沖池中,直接插入;否則,先將其放入插入緩沖區(qū)中,再以一定的頻率和索引頁(yè)合并,這時(shí),就可以將同一個(gè)索引頁(yè)中的多個(gè)插入合并到一個(gè)IO操作中,大大提高寫(xiě)性能。
二次寫(xiě) Double Write如果說(shuō)插入緩沖是為了提高寫(xiě)性能的話,那么兩次寫(xiě)是為了提高可靠性,犧牲了一點(diǎn)點(diǎn)寫(xiě)性能。
1)當(dāng)刷新緩沖池臟頁(yè)時(shí),并不直接寫(xiě)到數(shù)據(jù)文件中,而是先拷貝至內(nèi)存中的兩次寫(xiě)緩沖區(qū)。
2)接著從兩次寫(xiě)緩沖區(qū)分兩次寫(xiě)入磁盤(pán)共享表空間中,每次寫(xiě)入1MB
3)待第2步完成后,再將兩次寫(xiě)緩沖區(qū)寫(xiě)入數(shù)據(jù)文件自適應(yīng)哈希 Ahi 哈希索引是一種非??斓牡戎挡檎曳椒ǎㄗ⒁猓罕仨毷堑戎?,哈希索引對(duì)非等值查找方法無(wú)能為力),它查找的時(shí)間復(fù)雜度為常量,InnoDB采用自適用哈希索引技術(shù),它會(huì)實(shí)時(shí)監(jiān)控表上索引的使用情況,如果認(rèn)為建立哈希索引可以提高查詢(xún)效率,則自動(dòng)在內(nèi)存中的“自適應(yīng)哈希索引緩沖區(qū)”
-
預(yù)讀 Read Ahead
3. MySQL中varchar與char的區(qū)別以及varchar(50)中的50代表的涵義
- varchar與char的區(qū)別char是一種固定長(zhǎng)度的類(lèi)型,varchar則是一種可變長(zhǎng)度的類(lèi)型
- 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引擎也一樣)
4. innodb的事務(wù)與日志的實(shí)現(xiàn)方式
InnoDB的日志分類(lèi):
錯(cuò)誤日志:記錄出錯(cuò)信息,也記錄一些警告信息或者正確的信息。
查詢(xún)?nèi)罩荆河涗浰袑?duì)數(shù)據(jù)庫(kù)請(qǐng)求的信息,不論這些請(qǐng)求是否得到了正確的執(zhí)行。
慢查詢(xún)?nèi)罩荆涸O(shè)置一個(gè)閾值,將運(yùn)行時(shí)間超過(guò)該值的所有SQL語(yǔ)句都記錄到慢查詢(xún)的日志文件中。
二進(jìn)制日志:記錄對(duì)數(shù)據(jù)庫(kù)執(zhí)行更改的所有操作。
中繼日志:事務(wù)日志:
事務(wù)的4種隔離級(jí)別隔離級(jí)別:
- READ UNCOMMITTED 未提交讀,臟讀
- READ COMMITTED 提交讀
- REPEATABLE READ 可重復(fù)讀 幻讀
- SERAIALIZABLE 串行化
事務(wù)的特點(diǎn):
- 原子性 Atomicity
- 一致性 consistency
- 隔離性 isolation
- 持久性 durability
數(shù)據(jù)庫(kù)面試題(開(kāi)發(fā)者必看)
5. 三大范式
第一范式(1NF):數(shù)據(jù)庫(kù)表中的字段都是單一屬性的,不可再分。這個(gè)單一屬性由基本類(lèi)型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。
第二范式(2NF):數(shù)據(jù)庫(kù)表中不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的部分函數(shù)依賴(lài)(部分函數(shù)依賴(lài)指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所有非關(guān)鍵字段都完全依賴(lài)于任意一組候選關(guān)鍵字。
第三范式(3NF):在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴(lài)則符合第三范式。所謂傳遞函數(shù)依賴(lài),指的是如 果存在"A → B → C"的決定關(guān)系,則C傳遞函數(shù)依賴(lài)于A。因此,滿足第三范式的數(shù)據(jù)庫(kù)表應(yīng)該不存在如下依賴(lài)關(guān)系: 關(guān)鍵字段 → 非關(guān)鍵字段 x → 非關(guān)鍵字段y
首先要明確的是:滿足著第三范式,那么就一定滿足第二范式、滿足著第二范式就一定滿足第一范式
第一范式:字段是最小的的單元不可再分
學(xué)生信息組成學(xué)生信息表,有年齡、性別、學(xué)號(hào)等信息組成。這些字段都不可再分,所以它是滿足第一范式的
第二范式:滿足第一范式,表中的字段必須完全依賴(lài)于全部主鍵而非部分主鍵。
其他字段組成的這行記錄和主鍵表示的是同一個(gè)東西,而主鍵是唯一的,它們只需要依賴(lài)于主鍵,也就成了唯一的
學(xué)號(hào)為1024的同學(xué),姓名為Java3y,年齡是22歲。姓名和年齡字段都依賴(lài)著學(xué)號(hào)主鍵。
第三范式:滿足第二范式,非主鍵外的所有字段必須互不依賴(lài)
就是數(shù)據(jù)只在一個(gè)地方存儲(chǔ),不重復(fù)出現(xiàn)在多張表中,可以認(rèn)為就是消除傳遞依賴(lài)
比如,我們大學(xué)分了很多系(中文系、英語(yǔ)系、計(jì)算機(jī)系……),這個(gè)系別管理表信息有以下字段組成:系編號(hào),系主任,系簡(jiǎn)介,系架構(gòu)。那我們能不能在學(xué)生信息表添加系編號(hào),系主任,系簡(jiǎn)介,系架構(gòu)字段呢?不行的,因?yàn)檫@樣就冗余了,非主鍵外的字段形成了依賴(lài)關(guān)系(依賴(lài)到學(xué)生信息表了)!正確的做法是:學(xué)生表就只能增加一個(gè)系編號(hào)字段。
6. 什么是存儲(chǔ)過(guò)程?有哪些優(yōu)缺點(diǎn)?
存儲(chǔ)過(guò)程就像我們編程語(yǔ)言中的函數(shù)一樣,封裝了我們的代碼(PLSQL、T-SQL)。
存儲(chǔ)過(guò)程的優(yōu)點(diǎn):
能夠?qū)⒋a封裝起來(lái)
保存在數(shù)據(jù)庫(kù)之中
讓編程語(yǔ)言進(jìn)行調(diào)用
存儲(chǔ)過(guò)程是一個(gè)預(yù)編譯的代碼塊,執(zhí)行效率比較高
一個(gè)存儲(chǔ)過(guò)程替代大量T_SQL語(yǔ)句 ,可以降低網(wǎng)絡(luò)通信量,提高通信速率
存儲(chǔ)過(guò)程的缺點(diǎn):
每個(gè)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程語(yǔ)法幾乎都不一樣,十分難以維護(hù)(不通用)
業(yè)務(wù)邏輯放在數(shù)據(jù)庫(kù)上,難以迭代
7. 什么是視圖?以及視圖的使用場(chǎng)景有哪些?
8. drop、delete與truncate分別在什么場(chǎng)景之下使用?
數(shù)據(jù)庫(kù)中drop delete truncate 的區(qū)別
9. B樹(shù)和B+樹(shù)的插入、刪除圖文詳解
MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理
10. MySQL聚集索引和非聚集索引
11. MySQL數(shù)據(jù)庫(kù)的鎖機(jī)制
[MySQL數(shù)據(jù)庫(kù)的鎖機(jī)制](https://juejin.im/entry/5a4b2e7ef265da431a438e4a)