一、數(shù)據(jù)類型
- 整數(shù)類型
- TINYINT
- SMALLINT
- MEDIUMINT
- INT
- BIGINT
- 屬性:UNSIGNED
-
長(zhǎng)度:可以為整數(shù)類型指定寬度,例如:INT(11)、對(duì)大多數(shù)應(yīng)用是沒有意義的,它不會(huì)限制值的合法范圍,只會(huì)影響顯示字符的個(gè)數(shù)
- 實(shí)數(shù)類型
- FLOAT
- DOUBLE
- DECIMAL
- DECIMAL可存儲(chǔ)比BIGINT還大的整數(shù);可以用于存儲(chǔ)精確的小數(shù)
- FLOAT和DOUBLE類型支持使用標(biāo)準(zhǔn)的浮點(diǎn)進(jìn)行近視計(jì)算
- 字符串類型
- VARCHAR
- CHAR
- TEXT
- BLOB
- VARCHAR類型用于存儲(chǔ)可變長(zhǎng)字符串,它比定長(zhǎng)類型更節(jié)省空間
- VARCHAR使用1或2個(gè)額外字節(jié)記錄字符串的長(zhǎng)度,列長(zhǎng)度小于255字節(jié),使用1個(gè)字節(jié)表示,否則用2個(gè)
- VARCHAR長(zhǎng)度,如果存儲(chǔ)內(nèi)容超出指定長(zhǎng)度,會(huì)被截?cái)?/li>
- CHAR是定長(zhǎng)的,根據(jù)定義的字符串長(zhǎng)度分配足夠的空間
- CHAR會(huì)根據(jù)需要采用空格進(jìn)行填充以方便比較
- CHAR適合 存儲(chǔ)很短的字符串,或者所有值都接近同一個(gè)長(zhǎng)度
- CHAR長(zhǎng)度,超出設(shè)定的長(zhǎng)度,會(huì)被截?cái)?/li>
- 對(duì)于經(jīng)常變更的數(shù)據(jù),CHAR比VARCHAR更好,CHAR不容易產(chǎn)生碎片
- 對(duì)于非常短的列,CHAR比VARCHAR在存儲(chǔ)空間上更有效率
- 只分配真正的空間,更長(zhǎng)的列會(huì)消耗更多的內(nèi)存
- 盡量避免使用BLOB/TEXT類型,查詢會(huì)使用臨時(shí)表,導(dǎo)致嚴(yán)重的性能開銷
- 枚舉
- 有時(shí)可以使用枚舉代替常用的字符串類型
- 把不重復(fù)的集合存儲(chǔ)成一個(gè)預(yù)定義的集合
- 非常緊湊,把列表值壓縮到一個(gè)或兩個(gè)字節(jié)
- 內(nèi)部存儲(chǔ)的是整數(shù)
- 盡量避免使用數(shù)字作為ENUM枚舉的常量,易混亂
- 排序是按照內(nèi)部存儲(chǔ)的整數(shù)進(jìn)行排序
- 枚舉表會(huì)使表大小大大減小
- 日期和時(shí)間類型
- 盡量使用TIMESTAMP,比DATETIME空間效率高
- 用整數(shù)保存時(shí)間戳的格式通常不方便處理
- 如果需要存儲(chǔ)微妙,可以使用bigint存儲(chǔ)
- 列屬性
- auto_increment
- default
- not null
- zerofill
二、MySQL基礎(chǔ)操作
- 常見操作
- MySQL的連接和關(guān)閉Lmysql -u -p -h -P
- 其他:\G(打印結(jié)果垂直顯示)、\c(取消當(dāng)前mysql的命令)、\q(退出mysql)、\s(顯示mysql服務(wù)器狀態(tài))、\h(幫助信息)、\d(改變執(zhí)行服務(wù))
三、MySQL數(shù)據(jù)表引擎
- InnoDB表引擎(優(yōu)先選擇)
- 默認(rèn)事務(wù)型引擎,最重要最廣泛的存儲(chǔ)引擎,性能非常優(yōu)秀
- 數(shù)據(jù)存儲(chǔ)在共享表空間,可以通過配置分開
- 對(duì)主鍵查詢的性能高于其他類型的存儲(chǔ)引擎
- 內(nèi)部做了很多優(yōu)化,從磁盤讀取數(shù)據(jù)時(shí)自動(dòng)在內(nèi)存構(gòu)建hash索引,插入數(shù)據(jù)時(shí)自動(dòng)構(gòu)建插入緩沖區(qū)
- 通過一些機(jī)制和工具支持真正的熱備份
- 支持崩潰后的安全恢復(fù)
- 支持行級(jí)鎖
- 支持外鍵
- MyISAM表引擎
- 5.1版本前,MyISAM是默認(rèn)的存儲(chǔ)引擎
- 擁有全文索引、壓縮、空間函數(shù)
- 不支持事務(wù)和行級(jí)鎖,不支持崩潰后的安全恢復(fù)
- 表存儲(chǔ)在兩個(gè)文件,MYD(數(shù)據(jù))和MYI(索引)
- 設(shè)計(jì)簡(jiǎn)單,某些場(chǎng)景下性能很好
- 其他表引擎
- Archive
- Blackhole
- CSV
- Memory
四、MySQL鎖機(jī)制
- 概念:表鎖是日常開發(fā)當(dāng)中常見的問題,當(dāng)多個(gè)查詢同一時(shí)刻進(jìn)行數(shù)據(jù)修改時(shí),就會(huì)產(chǎn)生并發(fā)控制的問題
- 共享鎖和排它鎖,也就是讀鎖和寫鎖
- 讀鎖:共享的,不堵塞,多個(gè)用戶可以同時(shí)讀一個(gè)資源,互不干擾
- 寫鎖:排他的,一個(gè)寫鎖會(huì)阻塞其他的寫鎖和讀鎖,這樣可以只允許一個(gè)人進(jìn)行寫入,防止其他用戶讀取正在寫入的資源
- 鎖粒度
- 表鎖,系統(tǒng)性能開銷最小,會(huì)鎖定整張表,MyISAM使用表鎖
- 行鎖,最大程度地支持并發(fā)處理,但是也帶來了最大的鎖開銷,InnoDB實(shí)現(xiàn)行級(jí)鎖
五、MySQL事務(wù)處理
- MySQL提供事務(wù)處理的表引擎,InnoDB
- 服務(wù)器層不管理事務(wù),由下層的引擎實(shí)現(xiàn),所以同一個(gè)事務(wù)中,使用多種存儲(chǔ)引擎不靠譜
- 在非事務(wù)的表上 執(zhí)行事務(wù)操作MySQL不會(huì)發(fā)出提醒,也不會(huì)報(bào)錯(cuò)
六、MySQL存儲(chǔ)過程
- 存儲(chǔ)過程
- 為以后的使用而保存的一條或多條MySQL語(yǔ)句的集合
- 存儲(chǔ)過程就是有業(yè)務(wù)邏輯和流程的集合
- 可以在存儲(chǔ)過程中創(chuàng)建表,更新數(shù)據(jù),刪除等等
- 使用場(chǎng)景
- 通過把處理封裝在容易使用的單元中,簡(jiǎn)化復(fù)雜的操作
- 保證數(shù)據(jù)的一致性
- 簡(jiǎn)化對(duì)變動(dòng)的管理
七、MySQL觸發(fā)器
- 觸發(fā)器
- 提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲(chǔ)過程
- 使用場(chǎng)景
- 可通過數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改
- 實(shí)時(shí)監(jiān)控某張表中的某個(gè)字段的更改而需要做出相應(yīng)的處理
- 某些業(yè)務(wù)編號(hào)的生成等
- 濫用會(huì)造成數(shù)據(jù)庫(kù)及應(yīng)用程序的維護(hù)困難
