MYSQL開(kāi)發(fā)規(guī)范

(一)建表規(guī)約

1.【強(qiáng)制】在編寫(xiě)建表語(yǔ)句時(shí)筏养,需同時(shí)考慮回滾、以及必要的初始化語(yǔ)句;生產(chǎn)環(huán)境變更表或數(shù)據(jù)時(shí)須提供變更和回滾sql文件捞蛋。

? ? ??說(shuō)明: 以"項(xiàng)目名_版本號(hào)_Create.DDL"吠撮、"項(xiàng)目名_版本號(hào)_RollBack.DDL尊惰、"項(xiàng)目名_版本號(hào)_InitData.DML",

? ? ? ? ? ? ? ? ? 分別表示創(chuàng)建泥兰、回滾弄屡、初始化數(shù)據(jù)的sql文件放在項(xiàng)目工程的對(duì)應(yīng)文件夾中。

2.【強(qiáng)制】數(shù)據(jù)庫(kù)版本統(tǒng)一為MySQL5.6鞋诗,引擎統(tǒng)一使用InnoDB膀捷。

3.【強(qiáng)制】庫(kù)名、表名削彬、字段命名全庸,必須使用小寫(xiě)字母或數(shù)字組成,庫(kù)名應(yīng)與應(yīng)用名稱(chēng)一致融痛、表或字段名以英文單詞加"_"

? ? ?? ? ? ? ? ??表示其用途/目標(biāo)/意義來(lái)命名壶笼,表名、字段名不超過(guò)32個(gè)字符雁刷、表字段數(shù)量不超過(guò)35個(gè)覆劈。

? ? ? ? ? ? ? ? ?正例:poseidon(庫(kù)名)、send_task(表名),send_task_logs_201710(表名)墩崩、user_login_name(字段名)

4.【強(qiáng)制】主鍵索引名為 pk_字段名氓英、唯一索引名為 uk_字段名、普通索引名則為 idx_字段名鹦筹,索引數(shù)量不超過(guò)5個(gè)铝阐。

? ? ??說(shuō)明:pk_ 即 primary key;uk_ 即 unique key铐拐;idx_ 即 index 的簡(jiǎn)稱(chēng)

5.【強(qiáng)制】表達(dá)是與否概念的字段徘键,必須使用 is_xxx 的方式命名,數(shù)據(jù)類(lèi)型是 unsigned tinyint( 1 表示是遍蟋,0 表示否)吹害。

? ? ??說(shuō)明:任何字段如果為非負(fù)數(shù),必須是 unsigned虚青。

? ? ??正例:表達(dá)邏輯刪除的字段名 is_deleted它呀,1 表示刪除,0 表示未刪除棒厘。

6.【參考】業(yè)務(wù)數(shù)據(jù)需要進(jìn)行簡(jiǎn)單的歸類(lèi)纵穿,但相對(duì)要支持靈活變化,應(yīng)使用數(shù)據(jù)字典表或通過(guò)統(tǒng)一服務(wù)的形式獲取奢人,

? ? ? ? ? ? ? ? ?禁止通過(guò)distinct語(yǔ)句在業(yè)務(wù)數(shù)據(jù)表去重獲取,禁止將歸類(lèi)寫(xiě)死在業(yè)務(wù)處理類(lèi)和方法中谓媒。

7.【強(qiáng)制】合適的字符存儲(chǔ)長(zhǎng)度,不但節(jié)約數(shù)據(jù)庫(kù)表空間何乎、節(jié)約索引存儲(chǔ)句惯,更重要的是提升檢索速度。

? ? ?說(shuō)明:設(shè)計(jì)時(shí)盡量使用少的空間存儲(chǔ)字段支救,如能用int的就不用char或者varchar抢野、能用tinyint的就不用int 、

? ? ? 能用varchar(20)的就不用varchar(255)各墨。

8.【推薦】關(guān)于char蒙保、varchar、text應(yīng)根據(jù)是否定長(zhǎng)欲主、最大支持長(zhǎng)度邓厕、效率等因素合理選擇類(lèi)型,建議為:

? ? ? ? ? ? ? 1)?經(jīng)常變化的字段用varchar

? ? ? ? ? ? ? 2)?知道固定長(zhǎng)度的用char

? ? ? ? ? ? ? 3)?盡量用varchar

? ? ? ? ? ? ? 4)?超過(guò)255字節(jié)的只能用varchar或者text

? ? ? ? ? ? ? 5)?能用varchar的地方不用text

? ? ? ? ? ? ? 6) 如超長(zhǎng)(如5000)定義字段類(lèi)型為 text扁瓢,獨(dú)立出來(lái)一張表详恼,用主鍵來(lái)對(duì)應(yīng),避免影響其它字段執(zhí)引效率引几。

9.【禁止】禁用保留字昧互,如 desc挽铁、range、match敞掘、delayed 等叽掘,請(qǐng)參考?MySQL 官方保留字

10.【禁止】小數(shù)類(lèi)型為 decimal玖雁,禁止使用 float 和 double更扁。

? ? ? ??說(shuō)明:float 和 double 在存儲(chǔ)的時(shí)候,存在精度損失的問(wèn)題赫冬,很可能在值的比較時(shí)浓镜,得到不

? ? ? ? ? ? ? ? ? ?正確的結(jié)果。如果存儲(chǔ)的數(shù)據(jù)范圍超過(guò) decimal 的范圍劲厌,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開(kāi)存儲(chǔ)膛薛。

11.【強(qiáng)制】表必備三字段:id, create_time, modified_time。

? ? ? ? ?說(shuō)明:其中 id 必為主鍵补鼻。create_time表示主動(dòng)創(chuàng)建,?modified_time過(guò)去分詞表示被動(dòng)更新哄啄。

12.【強(qiáng)制】時(shí)間格式統(tǒng)一用yyyy-MM-dd HH:mm:ss.fff,精準(zhǔn)到毫秒风范;存儲(chǔ)增淹、傳輸統(tǒng)一用北京時(shí)間,

? ? ? ? ??如有其它時(shí)區(qū)時(shí)間(如下單乌企、付款等時(shí)間)保留原始時(shí)間、轉(zhuǎn)換的原則為誰(shuí)用誰(shuí)轉(zhuǎn)換成玫。

13.【推薦】字段允許適當(dāng)冗余加酵,以提高查詢(xún)性能,但必須考慮數(shù)據(jù)一致哭当。冗余字段應(yīng)遵循:

? ? ? ? ? ? ? ? ? ?1)不是頻繁修改的字段猪腕。

? ? ? ? ? ? ? ? ? ?2)不是 varchar 超長(zhǎng)字段,更不能是 text 字段钦勘。

? ? ? ?正例:商品類(lèi)目名稱(chēng)使用頻率高陋葡,字段長(zhǎng)度短,名稱(chēng)基本一成不變彻采,可在相關(guān)聯(lián)的表中冗余存

? ? ? ? ? ? ? ? ? 儲(chǔ)類(lèi)目名稱(chēng)腐缤,避免關(guān)聯(lián)查詢(xún)。

14.【推薦】單表行數(shù)超過(guò) 100 萬(wàn)行或者單表容量超過(guò) 1GB肛响,才推薦進(jìn)行分庫(kù)分表分區(qū)岭粤。

? ? ? ? ?說(shuō)明:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個(gè)級(jí)別,請(qǐng)不要在創(chuàng)建表時(shí)就分庫(kù)分表分區(qū)特笋。

15.【強(qiáng)制】表剃浇、字段注釋(COMMENT)需遵守以下注釋約束,如有修改字段含義或?qū)ψ侄伪硎镜臓顟B(tài)追加時(shí),

? ? ? ? ? ? ? ? ? ? 需要及時(shí)更新字段注釋以及《數(shù)據(jù)庫(kù)設(shè)計(jì)說(shuō)明書(shū)》虎囚,注釋格式參考:

? ? ? ? ? ? ? ? ? 1)? 表/視圖注釋格式為:用途|負(fù)責(zé)人|創(chuàng)建日期 角塑,如:記錄用戶(hù)身份證號(hào)碼|張三|2017-12-28

? ? ? ? ? ? ? ? ? 2)? 字段注釋格式為:用途|說(shuō)明 , 如:記錄用戶(hù)性別|1男淘讥,2女圃伶,3未知(李四 2017-12-28 新增)

? ? ? ? ? ? ? ? ? 3)? 關(guān)聯(lián)字段來(lái)源需要說(shuō)明,來(lái)自哪張表的那個(gè)字段适揉,如:取自eload_user.user_id

16.【禁止】禁止定義枚舉類(lèi)型的表留攒;因?yàn)樵谑褂胏anal內(nèi)核的產(chǎn)品無(wú)法拉到數(shù)據(jù)

17.【強(qiáng)制】字符類(lèi)型的存儲(chǔ)禁止用null,用""代替嫉嘀;如有將字段和值拼接成字符串存儲(chǔ)的需要炼邀,統(tǒng)一先轉(zhuǎn)json格式存儲(chǔ)。

(二)索引規(guī)范

1.【推薦】ID剪侮、關(guān)聯(lián)字段拭宁、業(yè)務(wù)外鍵、create_time 字段推薦建索引瓣俯,在選擇性高的字段創(chuàng)建索引杰标,注意組合索引的順序,

? ? ? ? ? ? ? ? ?利用索引的最左原則彩匕,使用復(fù)合索引腔剂,而不是添加新的索引、避免冗余索引驼仪。

? ? ? ? ? ? ? ? ?反例:idx_a_b_c(a,b,c)掸犬、idx_a(a)、idx_a_b(a,b)

2.【推薦】業(yè)務(wù)上具有唯一特性的字段绪爸,且具有強(qiáng)唯一性要求湾碎。推薦建成唯一索引。

? ? ??說(shuō)明: 不要以為唯一索引影響了 insert 速度奠货,這個(gè)速度損耗可以忽略介褥,但提高查找速度是明顯的;

? ? ? ? ? ? ? ? ? 另外递惋,即使在應(yīng)用層做了非常完善的校驗(yàn)控制柔滔,只要沒(méi)有唯一索引,根據(jù)墨菲定律萍虽,必然有臟數(shù)據(jù)產(chǎn)生廊遍。

? ? ??示例:如身份證號(hào)碼,在業(yè)務(wù)層面已經(jīng)做了唯一性檢查贩挣,但在表設(shè)計(jì)時(shí)還是要加唯一索引約束喉前。

3.【推薦】原則上超過(guò)三個(gè)表禁止 join没酣,如超過(guò)三張以上表join須集體評(píng)審討論通過(guò)。需要 join 的字段卵迂,

? ? ? ? ? ? ? ? ?數(shù)據(jù)類(lèi)型必須絕對(duì)一致裕便;多表關(guān)聯(lián)查詢(xún)時(shí),保證被關(guān)聯(lián)的字段需要有索引见咒。

? ? ??說(shuō)明:即使雙表 join 也要注意表索引偿衰、SQL 性能。

4.【推薦】在 varchar 字段上建立索引時(shí)改览,建議指定索引長(zhǎng)度下翎,沒(méi)必要對(duì)全字段建立索引,根據(jù)

? ? ? ? ? ? ? ? ?實(shí)際文本區(qū)分度決定索引長(zhǎng)度即可宝当。

? ? ? ?說(shuō)明:索引的長(zhǎng)度與區(qū)分度是一對(duì)矛盾體视事,一般對(duì)字符串類(lèi)型數(shù)據(jù),長(zhǎng)度為 20 的索引庆揩,區(qū)分

? ? ? ? ? ? ? ? 度會(huì)高達(dá) 90%以上俐东,可以使用 count(distinct left(列名, 索引長(zhǎng)度))/count(*)的區(qū)分度來(lái)確定。

? ? ? ?示例:如varchar(1024)订晌,索引長(zhǎng)度為36時(shí)區(qū)分度就有?90%以上虏辫,就沒(méi)必須建立1024長(zhǎng)度的索引。

5.【強(qiáng)制】頁(yè)面搜索嚴(yán)禁左模糊或者全模糊锈拨,如果需要請(qǐng)走搜索引擎來(lái)解決砌庄。

? ? ? ?說(shuō)明:索引文件具有 B-Tree 的最左前綴匹配特性,如果左邊的值未確定奕枢,那么無(wú)法使用此索引娄昆。

6.【推薦】如果有 order by 的場(chǎng)景,請(qǐng)注意利用索引的有序性验辞。order by 最后的字段是組合

? ? ? ? ? ? ? ? ?索引的一部分,并且放在索引組合順序的最后喊衫,避免出現(xiàn) file_sort 的情況跌造,影響查詢(xún)性能。

? ? ? ? ? ? ? ? ?正例:where a=? and b=? order by c; 索引:a_b_c

? ? ? ? ? ? ? ? ?反例:索引中有范圍查找族购,那么索引有序性無(wú)法利用壳贪,如:WHERE a>10 ORDER BY b; 索引a_b 無(wú)法排序。

7. 【推薦】利用覆蓋索引來(lái)進(jìn)行查詢(xún)操作寝杖,避免回表违施。

? ? ? ?說(shuō)明:如果索引包含所有滿(mǎn)足查詢(xún)需要的數(shù)據(jù)的索引成為覆蓋索引(Covering Index),也就是平時(shí)所說(shuō)的不需要回表操作

? ? ? ?說(shuō)明:使用explain瑟幕,可以通過(guò)輸出的extra列來(lái)判斷磕蒲,對(duì)于一個(gè)索引覆蓋查詢(xún)留潦,顯示為using index,

? ? ? ? ? ? ? ? ??MySQL查詢(xún)優(yōu)化器在執(zhí)行查詢(xún)前會(huì)決定是否有索引覆蓋查詢(xún)

8. 【推薦】利用延遲關(guān)聯(lián)或者子查詢(xún)優(yōu)化超多分頁(yè)場(chǎng)景。

? ? ??說(shuō)明:MySQL 并不是跳過(guò) offset 行辣往,而是取 offset+N 行兔院,然后返回放棄前 offset 行,返回

? ? ? ? ? ? ? ? ?N 行站削,當(dāng) offset 特別大的時(shí)候坊萝,效率會(huì)非常的低下。

? ? ??正例:通過(guò)使用覆蓋索引查詢(xún)返回需要的主鍵,再根據(jù)主鍵關(guān)聯(lián)原表獲得需要的數(shù)據(jù)许起。

9. 【推薦】SQL 性能優(yōu)化的目標(biāo):至少要達(dá)到 range 級(jí)別十偶,要求是 ref 級(jí)別,如果可以是 consts最好园细。

? ? ??說(shuō)明: 以下列出的12種級(jí)別惦积,等級(jí)依次降低:

? ? ? 1)?system:系統(tǒng)表,表只有一行記錄珊肃。這是const表連接類(lèi)型的一個(gè)特例荣刑;

? ? ? 2)?const:?表中最多只有一行匹配的記錄。讀常量伦乔,由于只有一行記錄厉亏,優(yōu)化程序里該行記錄的字段值可以被當(dāng)作是一

? ? ? ? ? 個(gè)常量,僅在查詢(xún)開(kāi)始時(shí)讀取一次烈和。當(dāng)PRIMARY KEY或UNIQUE索引與常量進(jìn)行比較時(shí)會(huì)顯示const爱只,速度非常快招刹;

? ? ? 3)?eq_ref:類(lèi)似const恬试,const比較的是常量,eq_ref是同另一張表中的字段關(guān)聯(lián)比較疯暑,這是最好的連接類(lèi)型训柴,

? ? ? ? ? ? ? ? eq_ref出現(xiàn)在PRIMARY KEY或UNIQUE類(lèi)型索引進(jìn)行”=”做比較時(shí)檢索字段,

? ? ? ? ? ? ? ? 比較的值可以是固定值或者是表達(dá)式妇拯,表達(dá)示中可以使用表里的字段幻馁;

? ? ? 4)?ref:查詢(xún)時(shí)的索引類(lèi)型不是PRIMARY KEY或UNIQUE類(lèi)型索引導(dǎo)致匹配到的行有多個(gè),或者僅能用到索引的

? ? ? ? ? ? ? ? 左前綴而非全部時(shí)的訪問(wèn)類(lèi)型越锈,ref可被用于基于索引字段進(jìn)行 - 或 <=> 操作仗嗦;

? ? ? 5)?ref_or_null:與ref的唯一區(qū)別就是在使用索引引用的查詢(xún)之外再增加一個(gè)空值的查詢(xún)。這種連接類(lèi)型類(lèi)似ref甘凭,

? ? ? ? ? ? ? ? 不同的是MySQL會(huì)在檢索的時(shí)候額外的搜索包含NULL值的記錄稀拐,它經(jīng)常用于子查詢(xún)。

? ? ? 6)?index_merge:查詢(xún)中同時(shí)使用兩個(gè)(或更多)索引丹弱,然后對(duì)索引結(jié)果進(jìn)行合并(merge)德撬,再讀取表數(shù)據(jù)铲咨;

? ? ? 7)?unique_subquery:?子查詢(xún)中的返回結(jié)果字段組合是主鍵或唯一約束。用于in比較操作符中的子查詢(xún)錦繡谷的

? ? ? ? ? ? ? ?“鍵值唯一”的訪問(wèn)類(lèi)型場(chǎng)景中砰逻,如value in (select primary_key from table where x = x)

? ? ? 8)?index_subquery:子查詢(xún)中的返回結(jié)果字段組合是一個(gè)索引(或索引組合)鸣驱,但不是一個(gè)主鍵或唯一索引,

? ? ? ? ? ? ? ? ?這種連接類(lèi)型類(lèi)似unique_subquery蝠咆。它用子查詢(xún)來(lái)代替IN踊东,不過(guò)它用于在子查詢(xún)中沒(méi)有唯一索引的情況下。

? ? ? 9)?range:索引范圍掃描 刚操。只有在給定范圍的記錄才會(huì)被取出來(lái)闸翅,利用索引來(lái)取得一條記錄,

? ? ? ? ? ? ? ? ?常見(jiàn)于between菊霜、<坚冀、>等的查詢(xún)

? ? ?10)?index:全索引掃描 。連接類(lèi)型跟ALL一樣鉴逞,不同的是它只掃描索引樹(shù)记某。它通常會(huì)比ALL快點(diǎn)

? ? ? ? ? ? ? ? ?因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小。MySQL在查詢(xún)的字段只是單獨(dú)的索引的一部分的情況下使用這種連接類(lèi)型构捡;

? ? ?11)?fulltext:用于full text索引中用純文本匹配的方法來(lái)檢索記錄液南;

? ? ?12)?all:全表掃描。

10. 【強(qiáng)制】建組合索引的時(shí)候勾徽,區(qū)分度最高的在最左邊滑凉。

? ? ? ? ?正例:如果 where a=? and b=? ,a 列的幾乎接近于唯一值喘帚,那么只需要單建 idx_a 索引即可畅姊。

? ? ? ? ?說(shuō)明:存在非等號(hào)和等號(hào)混合判斷條件時(shí),在建索引時(shí)吹由,請(qǐng)把等號(hào)條件的列前置若未。如:where a>??

? ? ? ? ? ? ? ? ? ?and b=? 那么即使 a 的區(qū)分度更高,也必須把 b 放在索引的最前列倾鲫。

11. 【禁止】以下情況不走索引粗合,在編寫(xiě)sql或建索引時(shí)需慎重考慮:

? ? ? ? ? ? ? ? ?1) 條件字段選擇性弱,查出的結(jié)果集較大级乍,不走索引舌劳;

? ? ? ? ? ? ? ? ?2)?where條件等號(hào)兩邊字段類(lèi)型不同帚湘,不走索引玫荣;

? ? ? ? ? ? ? ? ?3)?優(yōu)化器分析的統(tǒng)計(jì)信息陳舊也可能導(dǎo)致不走索引;

? ? ? ? ? ? ? ? ?4)?索引字段 is null 不走索引大诸;

? ? ? ? ? ? ? ? ?5)?對(duì)于count(*)當(dāng)索引字段有not null約束時(shí)走索引捅厂,否則不走索引贯卦;

? ? ? ? ? ? ? ? ?6)?like 后面的字符當(dāng)首位為通配符時(shí)不走索引;

? ? ? ? ? ? ? ? ?7)?使用不等于操作符如:<>焙贷、!= 等不走索引撵割;

? ? ? ? ? ? ? ? ?8)?索引字段前加了函數(shù)或參加了運(yùn)算不走索引;

(三)SQL語(yǔ)句

1.【強(qiáng)制】重要的業(yè)務(wù)數(shù)據(jù)辙芍、配置數(shù)據(jù)等在做刪除處理時(shí)啡彬,推薦使用刪除標(biāo)記做邏輯刪除、不使用delete做物理刪除故硅;

? ? ? ? ? ? ? ? ?禁止update和delete語(yǔ)句后面沒(méi)有帶where條件庶灿。

2.【推薦】復(fù)雜的業(yè)務(wù)邏輯的判斷或操作,建議在業(yè)務(wù)代碼中分步驟拆分編寫(xiě)吃衅,如果一條sql寫(xiě)完往踢,

? ? ? ? ? ? ? ? ?會(huì)造成該sql語(yǔ)句過(guò)于復(fù)雜龐大,可讀性可維護(hù)性下變差徘层,性能一般也不會(huì)太高峻呕。

3.【強(qiáng)制】sql語(yǔ)句應(yīng)按照業(yè)務(wù)模塊等分文件統(tǒng)一寫(xiě)在xml或公用類(lèi)中,禁止sql語(yǔ)句與業(yè)務(wù)代碼混寫(xiě)在一起趣效。

4.【禁用】"<>"瘦癌、"!="、"not in"英支、"exsits"和"not exists"等反邏輯運(yùn)算符原則上禁用佩憾。

? ? ??說(shuō)明:"<>"、"!="干花、"not in"可用"="和"in"代替妄帘;"exsits"、"not exists"可用"等連接"和"外連接"

5.【推薦】關(guān)于or池凄、in抡驼、union all運(yùn)算符的選擇,建議同一字段肿仑,將or改寫(xiě)為in致盟,不同字段,將or改為union all

6.【強(qiáng)制】sql語(yǔ)句中的where子句中的每個(gè)條件的操作符兩邊類(lèi)型應(yīng)該相等尤慰,禁止?jié)撛诘臄?shù)據(jù)類(lèi)型做轉(zhuǎn)換馏锡。

7.【強(qiáng)制】不要使用 count(列名)或 count(常量)來(lái)替代 count(*),count(*)是 SQL92 定義的

? ? ? ? ? ? ? ? ?標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語(yǔ)法伟端,跟數(shù)據(jù)庫(kù)無(wú)關(guān)杯道,跟 NULL 和非 NULL 無(wú)關(guān)。

? ? ?說(shuō)明:count(*)會(huì)統(tǒng)計(jì)值為 NULL 的行责蝠,而 count(列名)不會(huì)統(tǒng)計(jì)此列為 NULL 值的行党巾。

8.【強(qiáng)制】count(distinct col) 計(jì)算該列除 NULL 之外的不重復(fù)行數(shù)萎庭,注意 count(distinct

? ? ? ? ? ? ? ? ?col1, col2) 如果其中一列全為 NULL,那么即使另一列有不同的值齿拂,也返回為 0驳规。

9.【強(qiáng)制】當(dāng)某一列的值全是 NULL 時(shí),count(col)的返回結(jié)果為 0署海,但 sum(col)的返回結(jié)果為

? ? ? ? ? ? ? ? ?NULL吗购,因此使用 sum()時(shí)需注意 NPE 問(wèn)題。

? ? ??正例:可以使用如下方式來(lái)避免 sum 的 NPE 問(wèn)題:SELECT IF(ISNULL(SUM(g)),0,SUM(g))??FROM table;

10. 【強(qiáng)制】使用 ISNULL()來(lái)判斷是否為 NULL 值砸狞。

? ? ? ??說(shuō)明:? NULL 與任何值的直接比較都為 NULL巩搏。

? ? ? ? ? ? ? ? ? ? 1) NULL<>NULL 的返回結(jié)果是 NULL,而不是 false趾代。

? ? ? ? ? ? ? ? ? ? 2) NULL=NULL 的返回結(jié)果是 NULL贯底,而不是 true。

? ? ? ? ? ? ? ? ? ? 3) NULL<>1 的返回結(jié)果是 NULL撒强,而不是 true禽捆。

11.【強(qiáng)制】在代碼中寫(xiě)分頁(yè)查詢(xún)邏輯時(shí),若 count 為 0 應(yīng)直接返回飘哨,避免執(zhí)行后面的分頁(yè)語(yǔ)句胚想。

12.【禁止】不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決芽隆。

? ? ? ?說(shuō)明:以學(xué)生和成績(jī)的關(guān)系為例浊服,學(xué)生表中的 student_id是主鍵,那么成績(jī)表中的 student_id

? ? ? ? ? ? ? ? ? 則為外鍵胚吁。如果更新學(xué)生表中的 student_id牙躺,同時(shí)觸發(fā)成績(jī)表中的 student_id 更新,即為

? ? ? ? ? ? ? ? ? 級(jí)聯(lián)更新腕扶。外鍵與級(jí)聯(lián)更新適用于單機(jī)低并發(fā)孽拷,不適合分布式、高并發(fā)集群半抱;級(jí)聯(lián)更新是強(qiáng)阻

? ? ? ? ? ? ? ? ? 塞脓恕,存在數(shù)據(jù)庫(kù)更新風(fēng)暴的風(fēng)險(xiǎn);外鍵影響數(shù)據(jù)庫(kù)的插入速度窿侈。

13.【禁止】禁止使用存儲(chǔ)過(guò)程炼幔、觸發(fā)器、游標(biāo)史简,這些難以調(diào)試和擴(kuò)展乃秀,更沒(méi)有移植性。

14.【強(qiáng)制】數(shù)據(jù)訂正(特別是刪除、修改記錄操作)時(shí)环形,要先確認(rèn),避免出現(xiàn)誤刪除衙傀,確認(rèn)無(wú)誤才能執(zhí)行更新語(yǔ)句抬吟。?

? ? ? ??示例:如A、B兩個(gè)線(xiàn)程都讀取某條數(shù)據(jù)其中一個(gè)字段值(如1000)做加100操作统抬,A線(xiàn)程將值更新為1100火本,

? ? ? ? B線(xiàn)程如果不加判斷,結(jié)果也會(huì)更新也為1100聪建,正確的結(jié)果值應(yīng)為1200钙畔,可通過(guò)增加版本號(hào)等字段來(lái)控制。

15.【推薦】in 操作能避免則避免金麸,若實(shí)在避免不了擎析,需要仔細(xì)評(píng)估 in 后邊的集合元素?cái)?shù)量,控制在 1000 個(gè)之內(nèi)挥下。

16.【強(qiáng)制】數(shù)據(jù)庫(kù)編碼格式揍魂、所字符存儲(chǔ)與表示,均以 utf-8 編碼棚瘟,注意字符統(tǒng)計(jì)函數(shù)的區(qū)別现斋。

? ? ? ??說(shuō)明:?SELECT LENGTH("輕松工作"); 返回為 12

? ? ? ? ? ? ? ? ? ? SELECT CHARACTER_LENGTH("輕松工作")偎蘸; 返回為 4

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庄蹋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迷雪,更是在濱河造成了極大的恐慌限书,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件章咧,死亡現(xiàn)場(chǎng)離奇詭異蔗包,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)慧邮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)调限,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人误澳,你說(shuō)我怎么就攤上這事耻矮。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵猪勇,是天一觀的道長(zhǎng)明棍。 經(jīng)常有香客問(wèn)我攒菠,道長(zhǎng)哨免,這世上最難降的妖魔是什么茎活? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮琢唾,結(jié)果婚禮上载荔,老公的妹妹穿的比我還像新娘。我一直安慰自己采桃,他們只是感情好懒熙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著普办,像睡著了一般工扎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衔蹲,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天肢娘,我揣著相機(jī)與錄音,去河邊找鬼舆驶。 笑死蔬浙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贞远。 我是一名探鬼主播畴博,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蓝仲!你這毒婦竟也來(lái)了俱病?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袱结,失蹤者是張志新(化名)和其女友劉穎亮隙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體垢夹,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溢吻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了果元。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片促王。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖而晒,靈堂內(nèi)的尸體忽然破棺而出蝇狼,到底是詐尸還是另有隱情,我是刑警寧澤倡怎,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布迅耘,位于F島的核電站贱枣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏颤专。R本人自食惡果不足惜纽哥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栖秕。 院中可真熱鬧春塌,春花似錦、人聲如沸累魔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)垦写。三九已至,卻和暖如春彰触,著一層夾襖步出監(jiān)牢的瞬間梯投,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工况毅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留分蓖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓尔许,卻偏偏與公主長(zhǎng)得像么鹤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子味廊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 庫(kù)表設(shè)計(jì) 庫(kù)名蒸甜、表名、字段名使用小寫(xiě)字母余佛,”_”分割柠新,不超過(guò)18 個(gè)字符,使用名詞且見(jiàn)名知意. 不使用temp辉巡、o...
    迷途的華生閱讀 1,013評(píng)論 0 10
  • 來(lái)源與:阿里云棲 禁止用于商業(yè)用途 ps:如果需要電子書(shū) 評(píng)論你們郵箱 我會(huì)發(fā)給你們 下面感覺(jué)還是有點(diǎn)亂 目錄 一...
    小向資源網(wǎng)閱讀 7,574評(píng)論 0 12
  • 一恨憎、 表設(shè)計(jì)類(lèi) 強(qiáng)制類(lèi)規(guī)范 創(chuàng)建表的存儲(chǔ)引擎必須是InnoDB。 每個(gè)表必須顯式的指定一個(gè)主鍵郊楣。 不允許使用聯(lián)合主...
    xianyu閱讀 386評(píng)論 0 0
  • 【同讀一本書(shū)劉姣】 2016-03-09-041 -《影響力》 【原文】 “對(duì)比原理在精神物理學(xué)領(lǐng)域里得到了長(zhǎng)...
    城市格調(diào)劉姣閱讀 327評(píng)論 1 0
  • 我容忍你憔恳,不是因?yàn)槲遗橙酰且驗(yàn)槲业牟蝗叹辉椋蝗炭吹阶约鹤兊煤湍阋粯颖氨衫觯@樣我會(huì)討厭我自己。
    三文魚(yú)蛋炒飯閱讀 275評(píng)論 0 0