關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)????
????關(guān)系型數(shù)據(jù)庫(kù)? (SQL)
????????MySql榔袋、Oracle请琳、Sql Sever....
? ? ? ? 通過(guò)表與表之間的行和列儲(chǔ)存數(shù)據(jù)
????非系型數(shù)據(jù)庫(kù)? (NoSQL)
? ? ? ? Redis、MogDB
? ? ? ? 對(duì)象存儲(chǔ),通過(guò)對(duì)象屬性來(lái)決定
INNODB與MYISAM的區(qū)別
????可在創(chuàng)建表后加入? EMGING=INNODB? 來(lái)選擇INNODB引擎
? ? ? ? ? ? ? ? ? ? ? ? ?????????MYISAM? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INNODB
事務(wù)支持? ? ? ? ? ? ? ? ? ? 不支持? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 支持
數(shù)據(jù)行鎖定????????? ? ? ? 不支持? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 支持
外鍵約束??????????????? ? ? 不支持? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 支持
全文索引? ? ? ? ? ? ? ? ? ? ? 支持? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不支持
表空間大小? ? ? ? ? ? ? ? ? 較小? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 較大,約為兩倍
常用操作:
? ??MYISAM:節(jié)約空間,運(yùn)行速度較快责球。
? ??INNODB:安全性高,事務(wù)處理,支持多表多用戶操作棕诵。
在物理內(nèi)存上:
? ? ? ?MySql表數(shù)組都存儲(chǔ)在data文件夾內(nèi)
? ?????INNODB:在數(shù)據(jù)庫(kù)表中只有一個(gè)? *.frm? 文件裁良,以及? ibdata1? 文件夾
? ??????MYISAM:對(duì)應(yīng)文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? *.frm? ? ? ? 表結(jié)構(gòu)定義文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? *.MYD? ? ? ?數(shù)據(jù)文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? *.MYI? ? ? ? 索引文件
設(shè)置數(shù)據(jù)庫(kù)的表的字符集
? ? 不設(shè)置的話默認(rèn)字符集為L(zhǎng)atin1,不支持中文⌒L祝可以在創(chuàng)建表語(yǔ)句后加? charset=utf8
? ? 也可以修改? my.ini? 文件? character-set-server=utf8 但不建議? 因?yàn)槿绻鼡Q環(huán)境容易發(fā)生亂碼的問(wèn)題价脾。
delete和TAUNCATE的區(qū)別
????相同:都可以刪除數(shù)據(jù),不會(huì)影響表結(jié)構(gòu)
? ? 不同:
? ? ? ? 1.TAUNCATE? 重新設(shè)置自增列 計(jì)數(shù)器會(huì)歸零
? ? ? ? 2.TAUNCATE? 不會(huì)影響事務(wù)
? ? ? ? 3.delete刪除如果引擎是??INNODB? 重啟數(shù)據(jù)庫(kù)后自增列會(huì)從1開(kāi)始(存在內(nèi)存中)
? ? ? ? 4.delete刪除如果引擎是??MYISAM??重啟數(shù)據(jù)庫(kù)后繼續(xù)從上一個(gè)子增量開(kāi)始(存在文件中)
? ??
建表規(guī)約#
強(qiáng)制部分#
【強(qiáng)制】?表達(dá)是與否概念的字段笛匙,必須使用?is_xxx?的方式命名侨把,數(shù)據(jù)類型是?unsigned tinyint?(1?表示是,0?表示否)妹孙。
說(shuō)明:任何字段如果為非負(fù)數(shù)秋柄,必須是?unsigned。
正例:表達(dá)邏輯的字段名?is_deleted蠢正,1?表示刪除骇笔,0?表示未刪除。
【強(qiáng)制】?表名嚣崭、字段名必須使用小寫字母或數(shù)字笨触,禁止出現(xiàn)數(shù)字開(kāi)頭,禁止兩個(gè)下劃線中間只出現(xiàn)數(shù)字雹舀。數(shù)據(jù)庫(kù)字段名的修改代價(jià)很大芦劣,因?yàn)闊o(wú)法進(jìn)行預(yù)發(fā)布,所以字段名稱需要慎重考慮说榆。
說(shuō)明:MySQL?在?Windows?下不區(qū)分大小寫虚吟,但在?Linux?下默認(rèn)是區(qū)分大小寫。因此签财,數(shù)據(jù)庫(kù)名串慰、表名、字段名唱蒸,都不允許出現(xiàn)任何大寫字母邦鲫,避免節(jié)外生枝。
正例:aliyun_admin油宜,rdc_config,level3_name
反例:AliyunAdmin怜姿,rdcConfig慎冤,level_3_name
【強(qiáng)制】?禁用保留字,如?desc沧卢、range蚁堤、match、delayed?等但狭,請(qǐng)參考?MySQL?官方保留字披诗。
【強(qiáng)制】?主鍵索引名為?pk_?字段名撬即;唯一索引名為?uk_?字段名;普通索引名則為?idx_?字段名呈队。
說(shuō)明:pk_?即?primary key剥槐;uk_?即?unique key;idx_?即?index?的簡(jiǎn)稱宪摧。
【強(qiáng)制】?小數(shù)類型為decimal粒竖,禁止使用?float?和?double。
說(shuō)明:在存儲(chǔ)的時(shí)候几于,float?和?double?都存在精度損失的問(wèn)題蕊苗,很可能在比較值的時(shí)候,得到不正確的結(jié)果沿彭。如果存儲(chǔ)的數(shù)據(jù)范圍超過(guò)?decimal?的范圍朽砰,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)并分開(kāi)存儲(chǔ)。
【強(qiáng)制】?如果存儲(chǔ)的字符串長(zhǎng)度幾乎相等喉刘,使用?char?定長(zhǎng)字符串類型瞧柔。
【強(qiáng)制】?varchar?是可變長(zhǎng)字符串,不預(yù)先分配存儲(chǔ)空間饱搏,長(zhǎng)度不要超過(guò)?5000非剃,如果存儲(chǔ)長(zhǎng)度大于此值,定義字段類型為?text推沸,獨(dú)立出來(lái)一張表备绽,用主鍵來(lái)對(duì)應(yīng),避免影響其它字段索引效率鬓催。
【強(qiáng)制】?表必備三字段:id,?create_time,?update_time肺素。
說(shuō)明:其中?id?必為主鍵,類型為?bigint unsigned宇驾、單表時(shí)自增倍靡、步長(zhǎng)為 1。create_time,?update_time
的類型均為?datetime?類型课舍。
推薦部分#
【推薦】?表的命名最好是遵循“業(yè)務(wù)名稱_表的作用”塌西。
正例:alipay_task?/?force_project?/?trade_config。
【推薦】?庫(kù)名與應(yīng)用名稱盡量一致筝尾。
【推薦】?如果修改字段含義或?qū)ψ侄伪硎镜臓顟B(tài)追加時(shí)捡需,需要及時(shí)更新字段注釋。
【推薦】?字段允許適當(dāng)冗余筹淫,以提高查詢性能站辉,但必須考慮數(shù)據(jù)一致。
冗余字段應(yīng)遵循:
不是頻繁修改的字段。
不是?varchar?超長(zhǎng)字段饰剥,更不能是?text?字段殊霞。
不是唯一索引的字段。
正例:商品類目名稱使用頻率高汰蓉,字段長(zhǎng)度短绷蹲,名稱基本一不變,可在相關(guān)聯(lián)的表中冗余存儲(chǔ)類目名稱古沥,避免關(guān)聯(lián)查詢瘸右。
【推薦】?單表行數(shù)超過(guò)?500?萬(wàn)行或者單表容量超過(guò)?2GB,才推薦進(jìn)行分庫(kù)分表岩齿。
說(shuō)明:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個(gè)級(jí)別太颤,請(qǐng)不要在創(chuàng)建表時(shí)就分庫(kù)分表。
參考部分#
【參考】?合適的字符存儲(chǔ)長(zhǎng)度盹沈,不但節(jié)約數(shù)據(jù)庫(kù)表空間龄章、節(jié)約索引存儲(chǔ),更重要的是提升檢索速度乞封。
事務(wù)
什么是事務(wù)
同時(shí)成功或者同時(shí)失敗
事務(wù)原則:ACID原則 原子性做裙,一致性,隔離性肃晚,持久性? ? ? ? ? ? ?(臟讀锚贱,幻讀......)
原子性(Atomicity):要么都成功,要么都失敗
一致性(Consistency):事務(wù)前后的數(shù)據(jù)完整性要保持一致
隔離性(Isolation):多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí)关串,數(shù)據(jù)庫(kù)為每個(gè)用戶開(kāi)啟的事務(wù)拧廊,不能被其他的操作數(shù)據(jù)所干擾
持久性(Durability):事務(wù)一旦提交則不可逆,被持久化到數(shù)據(jù)庫(kù)中
隔離所導(dǎo)致的一些問(wèn)題
臟讀:一個(gè)事務(wù)讀取了另一個(gè)沒(méi)有提交的數(shù)據(jù)
不可重復(fù)讀:在一個(gè)事務(wù)內(nèi)讀取表中某一行數(shù)據(jù)晋修。多次讀取結(jié)果不同
虛讀(幻讀):在一個(gè)事務(wù)內(nèi)讀取到了別的事務(wù)插入的數(shù)據(jù)吧碾,導(dǎo)致前后讀取不一致
索引
主鍵索引(PRIMARY KEY):唯一的標(biāo)識(shí) 非空且唯一
唯一索引(UNIQUE KEY):避免重復(fù)的列出現(xiàn)
常規(guī)索引(KEY/INDEX):默認(rèn)的? index、key 關(guān)鍵字來(lái)設(shè)置
全文索引(FULLTEXT):在特定引擎下有墓卦,MyISAM? ?快速定位數(shù)據(jù)
基礎(chǔ)語(yǔ)法:
MySql創(chuàng)建函數(shù)方法:
創(chuàng)建函數(shù)之前必須要寫:DELIMITER$$
Creat一個(gè)索引:
索引在數(shù)據(jù)量小的時(shí)候用處不大 但在數(shù)據(jù)量大的時(shí)候區(qū)別十分明顯
索引原則
索引不是越多越好
經(jīng)常變動(dòng)的字段不要加索引 會(huì)發(fā)生索引重構(gòu)影響性能
數(shù)據(jù)量小的表不需要加索引
索引一般加在經(jīng)常用來(lái)查詢的字段上
索引的數(shù)據(jù)結(jié)構(gòu):
? ? ? ? Hash :類型的索引
? ? ? ? Btree: InnoDB? 默認(rèn)的數(shù)據(jù)結(jié)構(gòu)
MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理
權(quán)限管理及備份
MySQL備份
為什么要備份:
? ? ? ? 保證重要數(shù)據(jù)不丟失
? ? ? ? 數(shù)據(jù)轉(zhuǎn)移
MySQL數(shù)據(jù)庫(kù)備份方式
? ? ? ? 直接拷貝物理文件
? ? ? ? 在可視話工具中手動(dòng)到處
? ? ? ? 使用命令到處? mysqldump? 命令行導(dǎo)出
規(guī)范數(shù)據(jù)庫(kù)設(shè)計(jì)
糟糕的數(shù)據(jù)庫(kù):
? ? ? ? 數(shù)據(jù)冗余 浪費(fèi)空間
? ? ? ? 數(shù)據(jù)插入刪除都會(huì)麻煩 異尘氪海【屏蔽使用物理外鍵】
? ? ? ? 程序的性能差
較好的數(shù)據(jù)庫(kù):
? ? ? ? 節(jié)省空間
? ? ? ? 保證數(shù)據(jù)庫(kù)完整性
? ? ? ? 方便開(kāi)發(fā)
軟件開(kāi)發(fā)中關(guān)于數(shù)據(jù)庫(kù)的設(shè)計(jì)
? ? ? ? 收集信息,分析需求
? ? ? ? 標(biāo)記實(shí)體落剪,落實(shí)字段
? ? ? ? 標(biāo)記實(shí)體之間的關(guān)系? ? ? ??
三大范式
為什么需要數(shù)據(jù)規(guī)范化睁本?
信息重復(fù)
更新異常
插入異常
? ? ? ? 無(wú)法正常顯示信息
刪除異常
? ? ? ? 丟失有效的信息
第一范式
????原子性:保證每一列不可再分
第二范式
? ? ? ? 前提:滿足第一范式
? ? ? ? 每張表只描述一件事情
第三范式
? ? ? ? 前提:滿足第一范式和第二范式
? ? ? ? 保證數(shù)據(jù)表中的每一列都和主鍵直接相關(guān) 不能間接相關(guān)
規(guī)范和性能的問(wèn)題
關(guān)聯(lián)查詢的表不得超過(guò)三張
考慮商業(yè)化的需求和目標(biāo),數(shù)據(jù)庫(kù)的性能更加重要
故意給某些表增加一些冗余的字段(從多表查詢變?yōu)閱伪恚?/p>
數(shù)據(jù)庫(kù)連接池
由于連接釋放十分浪費(fèi)資源
池化技術(shù):準(zhǔn)備一些預(yù)先的資源忠怖,調(diào)用時(shí)可以直接連接
最大連接數(shù):業(yè)務(wù)最高承受上限??
最小連接數(shù):程序常用的鏈接數(shù)
等待超時(shí)
編寫連接池? 實(shí)現(xiàn)接口 DataSource??
DBCP
C3P0
Druid:阿里巴巴
使用了這些數(shù)據(jù)庫(kù)連接池后呢堰,我們?cè)陧?xiàng)目開(kāi)發(fā)中就不需要編寫數(shù)據(jù)庫(kù)代碼了
DBCP:
? ? ? ? 導(dǎo)入jar包:commons-pool? ? ? ? ? ? commons-dbcp
C3P0:
? ? ? ? c3o0-0.9.5.5? ? ? ? ? ? mchange-commons-java-0.2.19
結(jié)論
? ? ? ? 無(wú)論使用什么數(shù)據(jù)源,本質(zhì)都是一樣的脑又,DataSource? 接口不會(huì)變暮胧,方法就不會(huì)變
SHOW PROFILE
1.開(kāi)啟 show profile功能 默認(rèn)記錄15條sql
set profiling = no
2.通過(guò)Show profiles查看語(yǔ)句運(yùn)行時(shí)間
3.診斷具體sql語(yǔ)句 show profile cup,block io for query 加Query_ID
4.嚴(yán)重排查參數(shù)