這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)MySQL開發(fā)設(shè)計(jì)規(guī)范有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比涪陵網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式涪陵網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋涪陵地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
命名規(guī)范
l 庫名、表名、字段名禁止超過32個(gè)字符。
l 所有數(shù)據(jù)庫對象名稱必須使用小寫字母并用下劃線分割
不同的數(shù)據(jù)庫名 DbName dbname
不同的表名 Table table tabLe
l 所有數(shù)據(jù)庫對象名稱(庫名、表名、字段名)禁止使用MySQL保留關(guān)鍵字
select id,username,from,age from tb_user
有兩個(gè)from,MySQL并不清楚這兩個(gè)from有什么區(qū)別,執(zhí)行上面會報(bào)錯
select id,username,`from`,age from tb_user 正確
l 數(shù)據(jù)庫對象的命名要能做到見名識義,并且最好不要超過32個(gè)字符
例如:用戶賬號表 user_account
用戶數(shù)據(jù)庫 aisino_userdb
l 臨時(shí)庫表必須以tmp_開頭并以日期為后綴, 例如tmp_test01_20161218
l 備份庫備份表必須以bak_開頭并以日期戳為后綴, 例如bak_test01_20161218
l 所有存儲相同數(shù)據(jù)的列名和列類型必須一致
CREATE TABLE customer_inf(
customer_inf id int unsigned auto increment not null comment '自增id',
customer_id int unsigned not null comment 'customer_login表的自增id,
.........................................
CREATE TABLE order_master(
order_id id int unsigned not null auto increment comment '訂單ID',
customer_id int unsigned not null comment '下單人ID',
.........................................
基礎(chǔ)規(guī)范
l 使用INNODB存儲引擎
支持事務(wù),行級鎖,更好的恢復(fù)性,高并發(fā)下性能更好
l INNODB表必須有主鍵列,使用auto_increment
l 數(shù)據(jù)庫和表的字符集統(tǒng)一使用UTF8
統(tǒng)一字符集可以避免由于字符集轉(zhuǎn)換產(chǎn)生的亂碼
MySQL中UTF8字符集漢字占3個(gè)字節(jié),ASCII碼占1個(gè)字節(jié)
l 表必須有主鍵
l 所有表和字段都需要添加注釋
使用comment添加表和列的備注
好處:從一開始就進(jìn)行數(shù)據(jù)字典的維護(hù)和整理
l 表數(shù)量不超過300個(gè)
l 盡量控制單表數(shù)據(jù)量的大小,建議數(shù)據(jù)控制在500萬行以內(nèi)
500萬并不是MySQL數(shù)據(jù)庫的限制,MySQL最多可以存儲多少萬數(shù)據(jù)?
這種限制取決于存儲設(shè)置和文件系統(tǒng)
可以用歷史數(shù)據(jù)歸檔,分庫分表等手段來控制數(shù)據(jù)量大小
l 禁止在數(shù)據(jù)庫中存儲圖片,視頻和文件等二進(jìn)制數(shù)據(jù)
把圖片或文件存儲到相應(yīng)的文件服務(wù)器中,數(shù)據(jù)庫中只存放圖片或文件的地址信息
通常文件很大,查詢IO操作耗時(shí),會影響數(shù)據(jù)庫的性能
利用更有效的利用緩存,避免讀入無用的冷數(shù)據(jù)
經(jīng)常一起使用的列放到一個(gè)表中
l 禁止在線上做數(shù)據(jù)庫壓力測試
l 禁止從開發(fā)環(huán)境,測試環(huán)境直連生產(chǎn)環(huán)境數(shù)據(jù)庫
數(shù)據(jù)庫各個(gè)環(huán)境之間要進(jìn)行隔離
l 臨時(shí)表和備份表必須定期清理(備份歸檔)
庫表設(shè)計(jì)
l 禁止使用分區(qū)表
分區(qū)表在物理上表現(xiàn)為多個(gè)文件,在邏輯上表現(xiàn)為一個(gè)表
謹(jǐn)慎選擇分區(qū)鍵,跨分區(qū)查詢效率可能更低
對于大表建議采用物理分表的方式管理大數(shù)據(jù)
l 拆分大字段和訪問頻率低的字段,分離冷熱數(shù)據(jù)
盡量做到冷熱數(shù)據(jù)分離,減小表的寬帶
MySQL限制最多存儲4096列,每一行數(shù)據(jù)的大小不能超過65535個(gè)字節(jié)
減少磁盤 IO,保證熱數(shù)據(jù)的內(nèi)存緩存命中率
l 按日期時(shí)間分表需符合YYYY[MM][DD][HH]格式
l 采用合適的分庫分表策略。
字段設(shè)計(jì)
l 避免使用TEXT,BLOB數(shù)據(jù)類型
建議把BLOB或TEXT列分離到單獨(dú)的擴(kuò)展表中
l 優(yōu)先選擇符合存儲需要的最小的數(shù)據(jù)類型, 使用INT UNSIGNED存儲IPV4
將字符串轉(zhuǎn)化為數(shù)字類型存儲:
INET_ATON('255.255.255.255')=4294967295
將數(shù)字類型轉(zhuǎn)化為字符串:
INET_NTOA(4294967295)='255.255.255.255'
l 使用TINYINT來代替ENUM類型
l 表字符集盡量選擇UTF8
l 避免使用ENUM枚舉數(shù)據(jù)類型
修改ENUM值需要使用ALTER語句
ENUM類型的ORDER BY操作效率低,需要額外操作
禁止使用數(shù)值作為ENUM的枚舉值
l 所有字段均定義為NOT NULL
索引NULL列需要額外的空間來保存,所以要占用更多的空間
進(jìn)行比較和計(jì)算時(shí)候要對NULL值做特殊處理,索引會失效
l 使用UNSIGNED存儲非負(fù)整數(shù)
無符號值取值范圍:
UNSIGNED INT (0--4294967295)
l 同財(cái)務(wù)相關(guān)的金額類數(shù)據(jù),必須使用decimal類型
Decimal類型為精準(zhǔn)浮點(diǎn)數(shù),在計(jì)算時(shí)不會丟失精度
占用空間由定義的寬度決定
可用于存儲比bigint更大的整數(shù)數(shù)據(jù)
l 盡量避免使用字符串存儲日期型數(shù)據(jù)
缺點(diǎn)1:無法用日期函數(shù)進(jìn)行比較和計(jì)算
缺點(diǎn)2:用字符串存儲日期要占用更多的空間
l 使用TIMESTAMP或DATATIME類型存儲時(shí)間
TIMESTAMP 1970-01-01 00:00:01 --2038-01-19 03:14:07
l INT類型固定占用4字節(jié)存儲,TIMESTAMP占用4字節(jié)和INT相同,但比INT可讀性高
l 禁止在數(shù)據(jù)庫中存儲明文密碼
索引規(guī)范
l 限制每張表的索引數(shù)量,建議單表索引數(shù)量不超過5個(gè)
l 禁止給表中的每一列都建立單獨(dú)的索引,單個(gè)索引中的字段數(shù)不超過5個(gè)
l 每個(gè)Innodb表都要有一個(gè)主鍵
不使用更新頻繁的列作為主鍵,不使用多列主鍵
主鍵建議選擇使用自增ID值
l 不使用更新頻繁的列
l 為經(jīng)常需要排序、分組和聯(lián)合操作的字段建立索引
常見索引列建議
SELECT,UPDATE,DELETE語句的WHERE從句中的列
包含在ORDER BY,GROUP BY,DISTINCT中的字段
多表JOIN的關(guān)聯(lián)列
l 為常作為查詢條件的字段建立索引
l 刪除不再使用或者很少使用的索引
l 最左前綴匹配原則,非常重要的原則。
l 盡量選擇區(qū)分度高的列作為索引
l 避免建立冗余索引和重復(fù)索引
index(a,b,c), index(a,b) ,index(a)
a列是冗余索引
l 對于頻繁的查詢優(yōu)先考慮使用覆蓋索引
覆蓋索引:就是包含了所有查詢字段的索引
全部字段不但是指where從句中出現(xiàn)的列,也包括出現(xiàn)在select從句,order by和group by從句中的列
覆蓋索引的好處:避免Innodb表進(jìn)行索引的二次查找
可以把隨機(jī)IO變?yōu)轫樞騃O加快查詢效率
SQL設(shè)計(jì)規(guī)范
l 避免隱式轉(zhuǎn)換,會導(dǎo)致索引失效
l 充分利用前綴索引
l 必須是最左前綴
l JOIN消耗較多內(nèi)存,產(chǎn)生臨時(shí)表
l 避免在數(shù)據(jù)庫中進(jìn)行數(shù)學(xué)運(yùn)算
l WHERE從句中禁止對列進(jìn)行函數(shù)轉(zhuǎn)換和計(jì)算
對列進(jìn)行函數(shù)轉(zhuǎn)換或計(jì)算會導(dǎo)致無法使用索引
where date(createtime)='20160901'
改進(jìn):
where createtime >= '20160901' and createtime < '20160902'
l 使用不等于(!= 或者 <>),無法使用索引
l 使用LIKE操作(如'%abc...')時(shí),無法使用索引
l 拒絕大SQL,拆分成小SQL
不支持SQL并行查詢,MySQL一個(gè)SQL只能使用一個(gè)CPU進(jìn)行計(jì)算
l 避免使用JOIN關(guān)聯(lián)太多的表
每join一個(gè)表會多占用一部分內(nèi)存(join_buffer_size)
會產(chǎn)生臨時(shí)表操作,影響查詢效率
MySQL最多允許關(guān)聯(lián)61個(gè)表,建議不超過5個(gè)
l 程序連接不同的數(shù)據(jù)庫使用不同的賬號,禁止跨庫查詢
l 用UNION ALL而不是UNION
UNION會把所有數(shù)據(jù)放到臨時(shí)表中后再進(jìn)行去重操作
UNION ALL不會再對結(jié)果集進(jìn)行去重操作
l 禁止使用select *進(jìn)行查詢及沒有字段列表的insert操作
l 禁止單條SQL語句同時(shí)更新多個(gè)表
l 盡量不使用select *,而使用SELECT <字段列表>查詢
SELECT *返回結(jié)果中包含很多并不需要的字段,消耗更多的CPU和IO以及網(wǎng)絡(luò)帶寬資源
無法使用覆蓋索引
行為規(guī)范
l 批量導(dǎo)入、導(dǎo)出數(shù)據(jù)必須提前通知DBA協(xié)助觀察
超過100萬行的批量寫操作,要分批多次進(jìn)行操作
l 對大表數(shù)據(jù)結(jié)構(gòu)的修改一定要謹(jǐn)慎,會造成嚴(yán)重的鎖表操作,尤其是生產(chǎn)環(huán)境,是不能忍受的
對于大表使用pt-online-schema-change修改表結(jié)構(gòu),不會鎖表
避免大表修改產(chǎn)生的主從延遲
避免在對表字段進(jìn)行修改時(shí)進(jìn)行鎖表
l 推廣活動或上線新功能須提前通知DBA,請求壓力評估
l 對于程序連接數(shù)據(jù)庫賬號,遵循權(quán)限最小原則
l 程序使用的賬號原則上不準(zhǔn)有drop權(quán)限
l 不使用super權(quán)限連接數(shù)據(jù)庫
禁止為程序使用的賬號賦予super權(quán)限
super權(quán)限只能留給DBA處理問題的賬號使用
l 對單表的多次alter操作必須合并為一次操作
l 產(chǎn)品出現(xiàn)非數(shù)據(jù)庫導(dǎo)致的故障時(shí)及時(shí)通知DBA協(xié)助排查
l 數(shù)據(jù)庫數(shù)據(jù)丟失,及時(shí)聯(lián)系DBA進(jìn)行恢復(fù)
l 重大項(xiàng)目的數(shù)據(jù)庫方案選型和設(shè)計(jì)必須提前通知DBA參與
l 對特別重要的庫表,提前與DBA溝通確定維護(hù)和備份優(yōu)先級
l 不在業(yè)務(wù)高峰期批量更新、查詢數(shù)據(jù)庫
l 批量導(dǎo)入、導(dǎo)出數(shù)據(jù)須提前通知DBA,請求協(xié)助觀察
l 數(shù)據(jù)庫DDL及重要SQL及早提及DBA評審
l 提及線上DDL需求,所有SQL語句須有備注說明
上述就是小編為大家分享的MySQL開發(fā)設(shè)計(jì)規(guī)范有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞標(biāo)題:MySQL開發(fā)設(shè)計(jì)規(guī)范有哪些
文章位置:http://jinyejixie.com/article34/iiscse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站內(nèi)鏈、網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)