1.何為范式?
第一范式(1NF):第一范式就是無(wú)重復(fù)屬性的列。
第二范式(2NF):第二范式是在第一范式的基礎(chǔ)上建立起來(lái)的,即滿(mǎn)足第二范式必須先滿(mǎn)足第一范式委乌。第二范式要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或行必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列荣回,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)遭贸。這個(gè)惟一屬性列被稱(chēng)為主關(guān)鍵字或主鍵、主碼心软。
第二范式要求實(shí)體的屬性完全依賴(lài)于主關(guān)鍵字壕吹。所謂完全依賴(lài)是指不能存在僅依賴(lài)主關(guān)鍵字一部分的屬性,如果存在删铃,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一個(gè)新的實(shí)體耳贬,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列猎唁,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)咒劲。簡(jiǎn)而言之,第二范式就是非主屬性非部分依賴(lài)于主關(guān)鍵字诫隅。
第三范式(3NF):滿(mǎn)足 3NF 必須先滿(mǎn)足 2NF腐魂。簡(jiǎn)而言之,3NF 要求一個(gè)數(shù)據(jù)庫(kù)表中不包含已在其它表中已包含的非主關(guān)鍵字信息逐纬。例如蛔屹,存在一個(gè)部門(mén)信息表,其中每個(gè)部門(mén)有部門(mén)編號(hào)(dept_id)豁生、部門(mén)名稱(chēng)兔毒、部門(mén)簡(jiǎn)介等信息。那么在員工信息表中列出部門(mén)編號(hào)后就不能再將部門(mén)名稱(chēng)沛硅、部門(mén)簡(jiǎn)介等與部門(mén)有關(guān)的信息再加入員工信息表中眼刃。如果不存在部門(mén)信息表,則根據(jù)第三范式也應(yīng)該構(gòu)建它摇肌,否則就會(huì)有大量的數(shù)據(jù)冗余。簡(jiǎn)而言之仪际,第三范式就是屬性不依賴(lài)于其它非主屬性围小。
2.sql 語(yǔ)句優(yōu)化點(diǎn)有哪些昵骤?
應(yīng)盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描肯适。
應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷变秦,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
select id from t where num is null
可以在 num 上設(shè)置默認(rèn)值 0框舔,確保表中 num 列沒(méi)有 null 值蹦玫,然后這樣查詢(xún):
select id from t where num=0
很多時(shí)候用 exists 代替 in 是一個(gè)好的選擇
用 Where 子句替換 HAVING 子句 因?yàn)?HAVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過(guò)濾
3.索引是什么?有什么作用以及優(yōu)缺點(diǎn)刘绣?
索引是對(duì)數(shù)據(jù)庫(kù)表中一或多個(gè)列的值進(jìn)行排序的結(jié)構(gòu)樱溉,是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
優(yōu)點(diǎn):
第一纬凤,通過(guò)創(chuàng)建唯一性索引福贞,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。
第二停士,可以大大加快 數(shù)據(jù)的檢索速度挖帘,這也是創(chuàng)建索引的最主要的原因。
第三恋技,可以加速表和表之間的連接拇舀,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
第四蜻底,在使用分組和排序 子句進(jìn)行數(shù)據(jù)檢索時(shí)骄崩,同樣可以顯著減少查詢(xún)中分組和排序的時(shí)間。
第五朱躺,通過(guò)使用索引刁赖,可以在查詢(xún)的過(guò)程中,使用優(yōu)化隱藏器长搀,提高系統(tǒng)的性能啦租。
缺點(diǎn):
第一浑侥,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù) 量的增加而增加。
第二慕淡,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外谅年,每一個(gè)索引還要占一定的物理空間稼病,如果要建立聚簇索引,那么需要的空間就會(huì)更大良蛮。
第三抽碌,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候决瞳,索引也要?jiǎng)討B(tài)的維護(hù)货徙,這樣就降低了數(shù)據(jù)的維護(hù)速度左权。
4.索引的實(shí)現(xiàn)?
平衡多路搜索樹(shù)B樹(shù)(B-tree)痴颊。B樹(shù)(Balance Tree)又叫做B- 樹(shù)(其實(shí)B-是由B-tree翻譯過(guò)來(lái)赏迟,所以B-樹(shù)和B樹(shù)是一個(gè)概念) ,它就是一種平衡多路查找樹(shù)蠢棱。下圖就是一個(gè)典型的B樹(shù):
5.什么是事務(wù)锌杀?
事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂的事務(wù)泻仙,它是一個(gè)操作序列糕再,這些操作要么都執(zhí)行,要么都不執(zhí)行饰豺,它是一個(gè)不可分割的工作單位亿鲜。事務(wù)是數(shù)據(jù)庫(kù)維護(hù)數(shù)據(jù)一致性的單位,在每個(gè)事務(wù)結(jié)束時(shí)冤吨,都能保持?jǐn)?shù)據(jù)一致性蒿柳。
6.數(shù)據(jù)庫(kù)的樂(lè)觀鎖和悲觀鎖是什么?
數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中的并發(fā)控制的任務(wù)是確保在多個(gè)事務(wù)同時(shí)存取數(shù)據(jù)庫(kù)中同一數(shù)據(jù)時(shí)不破壞事務(wù)的隔離性和統(tǒng)一性以及數(shù)據(jù)庫(kù)的統(tǒng)一性漩蟆。
樂(lè)觀并發(fā)控制(樂(lè)觀鎖)和悲觀并發(fā)控制(悲觀鎖)是并發(fā)控制主要采用的技術(shù)手段垒探。
悲觀鎖:假定會(huì)發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作
樂(lè)觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突怠李,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性圾叼。
7.簡(jiǎn)單說(shuō)一說(shuō)drop、delete與truncate的區(qū)別
SQL中的drop捺癞、delete夷蚊、truncate都表示刪除,但是三者有一些差別髓介。
delete和truncate只刪除表的數(shù)據(jù)不刪除表的結(jié)構(gòu)
速度,一般來(lái)說(shuō): drop> truncate >delete
delete語(yǔ)句是dml,這個(gè)操作會(huì)放到rollback segement中,事務(wù)提交之后才生效;
如果有相應(yīng)的trigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā). truncate,drop是ddl, 操作立即生效,原數(shù)據(jù)不放到rollback segment中,不能回滾. 操作不觸發(fā)trigger.
如果你對(duì)這三者的用法還不太熟悉惕鼓,建議閱讀: drop、truncate和delete的區(qū)別
8.drop唐础、delete與truncate分別在什么場(chǎng)景之下使用箱歧?
1.不再需要一張表的時(shí)候,用drop一膨。
2.想刪除部分?jǐn)?shù)據(jù)行時(shí)候呀邢,用delete,并且?guī)蟱here子句
3.保留表而刪除所有數(shù)據(jù)的時(shí)候用truncate
9.什么是視圖豹绪?以及視圖的使用場(chǎng)景有哪些价淌?
視圖是一種虛擬的表,具有和物理表相同的功能∈涔常可以對(duì)視圖進(jìn)行增豺型,改仲智,查买乃,操作,試圖通常是有一個(gè)表或者多個(gè)表的行或列的子集钓辆。對(duì)視圖的修改不影響基本表剪验。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢(xún)前联。
只暴露部分字段給訪問(wèn)者功戚,所以就建一個(gè)虛表,就是視圖似嗤。
查詢(xún)的數(shù)據(jù)來(lái)源于不同的表啸臀,而查詢(xún)者希望以統(tǒng)一的方式查詢(xún),這樣也可以建立一個(gè)視圖烁落,把多個(gè)表查詢(xún)結(jié)果聯(lián)合起來(lái)乘粒,查詢(xún)者只需要直接從視圖中獲取數(shù)據(jù),不必考慮數(shù)據(jù)來(lái)源于不同表所帶來(lái)的差異伤塌。
10.MySQL的復(fù)制原理以及流程
binlog線程——記錄下所有改變了數(shù)據(jù)庫(kù)數(shù)據(jù)的語(yǔ)句灯萍,放進(jìn)master上的binlog中;
從:io線程——在使用start slave 之后每聪,負(fù)責(zé)從master上拉取 binlog 內(nèi)容旦棉,放進(jìn) 自己的relay log中;
從:sql執(zhí)行線程——執(zhí)行relay log中的語(yǔ)句药薯;
11.MySQL中myisam與innodb的區(qū)別绑洛,至少5點(diǎn)
InnoDB支持事物,而MyISAM不支持事物
InnoDB支持行級(jí)鎖童本,而MyISAM支持表級(jí)鎖
InnoDB支持MVCC, 而MyISAM不支持
InnoDB支持外鍵真屯,而MyISAM不支持
InnoDB不支持全文索引,而MyISAM支持巾陕。
12.innodb引擎的4大特性
插入緩沖(insert buffer)
二次寫(xiě)(double write)
自適應(yīng)哈希索引(ahi)
預(yù)讀(read ahead)
13.innodb的事務(wù)與日志的實(shí)現(xiàn)方式
(1)讨跟、有多少種日志;錯(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ù)日志:
(2)澜共、事物的4種隔離級(jí)別隔離級(jí)別讀未提交(RU)讀已提交(RC)可重復(fù)讀(RR)串行
(3)向叉、事務(wù)是如何通過(guò)日志來(lái)實(shí)現(xiàn)的,說(shuō)得越深入越好嗦董。事務(wù)日志是通過(guò)redo和innodb的存儲(chǔ)引擎日志緩沖(Innodb log buffer)來(lái)實(shí)現(xiàn)的母谎,當(dāng)開(kāi)始一個(gè)事務(wù)的時(shí)候,會(huì)記錄該事務(wù)的lsn(log sequence number)號(hào); 當(dāng)事務(wù)執(zhí)行時(shí)京革,會(huì)往InnoDB存儲(chǔ)引擎的日志的日志緩存里面插入事務(wù)日志奇唤;當(dāng)事務(wù)提交時(shí),必須將存儲(chǔ)引擎的日志緩沖寫(xiě)入磁盤(pán)(通過(guò)innodb_flush_log_at_trx_commit來(lái)控制)匹摇,也就是寫(xiě)數(shù)據(jù)前咬扇,需要先寫(xiě)日志。這種方式稱(chēng)為“預(yù)寫(xiě)日志方式”廊勃。
14.MySQL中InnoDB引擎的行鎖是通過(guò)加在什么上完成(或稱(chēng)實(shí)現(xiàn))的懈贺?為什么是這樣子的?
InnoDB是基于索引來(lái)完成行鎖例: select * from tab_with_index where id = 1 for update;for update 可以根據(jù)條件來(lái)完成行鎖鎖定,并且 id 是有索引鍵的列,如果 id 不是索引鍵那么InnoDB將完成表鎖,并發(fā)將無(wú)從談起坡垫。
15.問(wèn)了下MySQL數(shù)據(jù)庫(kù)cpu飆升到500%的話(huà)他怎么處理梭灿?
列出所有進(jìn)程 show processlist 觀察所有進(jìn)程 多秒沒(méi)有狀態(tài)變化的(干掉)查看超時(shí)日志或者錯(cuò)誤日志 (做了幾年開(kāi)發(fā),一般會(huì)是查詢(xún)以及大批量的插入會(huì)導(dǎo)致cpu與i/o上漲,,,,當(dāng)然不排除網(wǎng)絡(luò)狀態(tài)突然斷了,,導(dǎo)致一個(gè)請(qǐng)求服務(wù)器只接受到一半,比如where子句或分頁(yè)子句沒(méi)有發(fā)送,當(dāng)然的一次被坑經(jīng)歷)葛虐。
16.你們數(shù)據(jù)庫(kù)是否支持emoji表情胎源,如果不支持,如何操作屿脐?
如果是utf8字符集的話(huà)涕蚤,需要升級(jí)至utf8_mb4方可支持。