一牧挣、數(shù)據(jù)庫設(shè)計(jì)的三大范式
? ? ? ? 1.表中字段不可再分割急前;
? ? ? ? 2.必須有主鍵,非主鍵列完全依賴于主鍵瀑构;
? ? ? ? 3.在2的基礎(chǔ)上裆针,非主鍵之間不能存在依賴。
二寺晌、存儲(chǔ)引擎
? ? ? ? (一)常見的存儲(chǔ)引擎
? ? ? ? InnoDB,MyIsAM,Archive,Memory等世吨。只有InnoDB支持事物。
? ? ? ? (二)InnoDB和MyIsAM的比較
? ? ? ? ?(三)事物
? ? ? ? 1.原子性:指事物執(zhí)行要么成功要么失敗呻征。
? ? ? ? 2.一致性:指事物提交前后數(shù)據(jù)保持一致耘婚。例如轉(zhuǎn)賬,甲乙二人金額總數(shù)是一致的陆赋。
? ? ? ? 3.隔離性:事物提交過程中不受其他事物的干擾和影響沐祷。
? ? ? ? 4.持久性:事物提交后會(huì)落盤到磁盤中持久化。
? ? ? ? (四)常見的現(xiàn)象
? ? ? ? 1.臟讀:指事物執(zhí)行過程中讀取到其他事物還未提交的數(shù)據(jù)攒岛;
? ? ? ? 2.不可重復(fù)度:事物中的兩次查詢結(jié)果中的數(shù)值不一致戈轿,強(qiáng)調(diào)同一行數(shù)據(jù)的差異;
? ? ? ? 3.幻讀:事物中的兩次查詢結(jié)果中的數(shù)據(jù)不一致阵子,強(qiáng)調(diào)結(jié)果中的行數(shù)發(fā)生變化思杯。
? ? ? ? (五)事物的隔離級(jí)別
? ? ? ? 1.讀未提交:會(huì)發(fā)生臟讀、幻讀和不可重讀讀的問題挠进;
? ? ? ? 2.讀已提交:會(huì)發(fā)生幻讀和不可重復(fù)讀的問題色乾;
? ? ? ? 3.可重復(fù)讀:會(huì)發(fā)生幻讀問題;
? ? ? ? 4.可串行:不會(huì)發(fā)生上述問題领突。
? ? ? ? ? ? ? ? 隔離級(jí)別越高暖璧,并發(fā)效率越低。大部分?jǐn)?shù)據(jù)庫的默認(rèn)隔離級(jí)別為讀已提交君旦,而mysql默認(rèn)隔離級(jí)別為可重復(fù)讀澎办。在5.0之前的mysql的默認(rèn)隔離級(jí)別也是讀未提交,這和mysql的主從一致性有關(guān)金砍。5.0版本之前局蚀,mysql的bin log文件的存儲(chǔ)格式為statment,只記錄對(duì)數(shù)據(jù)庫的修改操作恕稠,不記錄其他操作琅绅,導(dǎo)致主從一致性方面做的很差,數(shù)據(jù)經(jīng)常不一致鹅巍,因此隔離級(jí)別發(fā)生變化千扶。
三料祠、索引
? ? ? ?(一)B+樹與B樹的區(qū)別
? ? ? ? ? ?1.b+樹非葉子結(jié)點(diǎn)僅包含關(guān)鍵字信息,b-樹所有節(jié)點(diǎn)都有一個(gè)指針;
? ? ? ? ? ?2.b+樹葉子結(jié)點(diǎn)存儲(chǔ)有索引和數(shù)據(jù)信息,b-樹所有節(jié)點(diǎn)都有索引和數(shù)據(jù)信息澎羞;
? ? ? ? ? ?3.b+樹的葉子結(jié)點(diǎn)之間使用雙向鏈表連接髓绽,是有序的,方便范圍查找妆绞。
? ? ? ?(二)索引類型?
????????????聚族索引和非聚族索引顺呕。(聚族索引又稱為主鍵索引,主鍵索引要求不能為null摆碉,不能重復(fù))
? ? ? ? ? ? 單列索引、組合索引脓豪、唯一索引(唯一索引要求值唯一巷帝,但允許有null值,例如手機(jī)號(hào))
? ? ? ?(三)使用索引的建議
區(qū)扫夜、左楞泼、*、聯(lián)笤闯,算堕阔、串、模颗味、排
? ? ? ? ? ? 1.索引必須要有區(qū)分度超陆;
? ? ? ? ? ? 2.索引設(shè)計(jì)需要符合最左匹配原則;
? ? ? ? ? ? 3.盡量能不select *就不使用select *,能明確的字段盡量寫清楚浦马;
? ? ? ? ? ? 4.盡量多使用聯(lián)合索引加快查詢效率时呀;
? ? ? ? ? ? 5.索引字段中不能有運(yùn)算,包括加減乘除等晶默;
? ? ? ? ? ? 6.索引中不能包含字符串和數(shù)字的模糊匹配谨娜;
? ? ? ? ? ? 7.盡量少使用模糊查詢;比如like磺陡,%張這種查詢趴梢;
? ? ? ? ? ? 8.排序盡量使用索引字段。
? ? ? ?(四)explain--sql性能分析神器
? ? ? ? ? ?1.通過explain分析可獲知那些信息币他?
? ? ? ? ? ? ? ? ? ? 訪問類型type坞靶、可能存在的索引、實(shí)際命中的索引蝴悉、查詢了多少行滩愁、執(zhí)行時(shí)間。
? ? ? ? ? ? 2.type:
? ? ? ? ? ? ? ? system > const > eq_ref > ref > range > index > all
? ? ? ? ? ? ? ? system:表中只有一條數(shù)據(jù)辫封;
? ? ? ? ? ? ? ? const:通過索引一次就查到了數(shù)據(jù)硝枉;
? ? ? ? ? ? ? ? eq_ref:索引只有一條數(shù)據(jù)匹配廉丽;
? ? ? ? ? ? ? ? ref:索引有多條數(shù)據(jù)匹配;
? ? ? ? ? ? ? ? range:查詢到給定范圍的數(shù)據(jù)妻味;
? ? ? ? ? ? ? ? index:索引失效正压;
? ? ? ? ? ? ? ? all:全表查詢。
? ? ? ? ? ? ? ? ? ? sql語句最低要求要達(dá)到range級(jí)別责球,盡可能達(dá)到ref級(jí)別焦履。
? ? ? ?(五)大表如何優(yōu)化
? ? ? ? ? ? 策略:1.限定查詢范圍(只能查半年內(nèi)的聊天記錄等);
? ? ? ? ? ? ? ? ? ? ? ?2.讀寫分離雏逾;
? ? ? ? ? ? ? ? ? ? ? ?3.分庫分表嘉裤,垂直水平拆分;等
四栖博、mysql的日志
? ? ? ? ? ? ? ?主要包括查詢?nèi)罩拘汲琛⑹挛锶罩尽in log 等仇让,比較重要的是bin log和redo/undo log典奉。
? ? ? ? 1.bin log:二進(jìn)制日志文件。是數(shù)據(jù)庫級(jí)別的日志文件丧叽,主要記錄對(duì)表的修改操作(劃重點(diǎn):表卫玖、修改)。主要用于恢復(fù)數(shù)據(jù)和同步數(shù)據(jù)踊淳。bin log文件中數(shù)據(jù)的存儲(chǔ)格式有三種局服,分別是statment灾茁、row和mix杈曲。
? ? ? ? 2.redo log:InnoDB存儲(chǔ)引擎級(jí)別的日志文件宾尚,用于記錄事物的操作,可保證數(shù)據(jù)的完整性雹舀。
? ? ? ? 3.undo log:相當(dāng)于一個(gè)版本控制工具芦劣,記錄了redo log數(shù)據(jù)以及表中數(shù)據(jù)的不同版本∷涤埽可利用它實(shí)現(xiàn)事物的回滾操作虚吟。
五、mysql架構(gòu)
? ? ? ? ? ? 一條數(shù)據(jù)庫語句從客戶端傳到DB服務(wù)端的大致流程:
六签财、mysql并發(fā)策略
? ? ? ? 1.樂觀鎖
? ? ? ? 2.悲觀鎖
? ? ? ? 3.行鎖
? ? ? ? 4.表鎖
? ? ? ? 5.頁鎖
? ? ? ? 6.時(shí)間戳
? ? ? ? 7.redis分布式鎖