數(shù)據(jù)庫(kù)sql規(guī)范及優(yōu)化

最近生產(chǎn)數(shù)據(jù)庫(kù)頻繁報(bào)警哎媚,主要由于數(shù)據(jù)量越來(lái)越大喇伯,業(yè)務(wù)越來(lái)越復(fù)雜,不斷又有新人的添加拨与,不熟悉業(yè)務(wù)稻据,在加上書(shū)寫(xiě)的sql不規(guī)范,嚴(yán)重影響業(yè)務(wù)的穩(wěn)定性买喧。一個(gè)有問(wèn)題的sql 攀甚,會(huì)導(dǎo)致整個(gè)業(yè)務(wù)異常,下圖非常形象岗喉。綜合大家常見(jiàn)的問(wèn)題秋度,結(jié)合一些書(shū)籍和mysql 官網(wǎng)等整理了一下sql 規(guī)范。


image.png

基本規(guī)范

1钱床、同一個(gè)業(yè)務(wù)放入同一個(gè)庫(kù)荚斯,禁止跨庫(kù)連表
2、更新刪除操作,單次操作最多1萬(wàn)條
3事期、不建議使用存儲(chǔ)過(guò)程滥壕、觸發(fā)器、視圖等高級(jí)功能兽泣,數(shù)據(jù)庫(kù)功能單一绎橘,只用來(lái)存儲(chǔ)數(shù)據(jù),業(yè)務(wù)通過(guò)上層業(yè)務(wù)實(shí)現(xiàn)
4唠倦、對(duì)于統(tǒng)計(jì)功能數(shù)據(jù)讀操作在只讀庫(kù)中進(jìn)行
5称鳞、存儲(chǔ)引擎默認(rèn)使用innodb
6、庫(kù)名稠鼻、表名冈止、字段名稱(chēng)統(tǒng)一小寫(xiě)字母,下劃線(xiàn)’’_’’分割
7候齿、庫(kù)名熙暴、表名、字段名稱(chēng)盡量不超過(guò)12個(gè)字符
8慌盯、表一定要有主鍵
9周霉、建議使用UNSIGNED 存儲(chǔ)非負(fù)數(shù)值
10、使用短數(shù)據(jù)類(lèi)型亚皂,使用TINYINT UNSIGNED
11俱箱、盡可能不使用TEXT、BLOG類(lèi)型孕讳,如果一定要使用建議將此類(lèi)型拆分到擴(kuò)展表
12、varchar(N),N 表示的是字符數(shù)不是字節(jié)數(shù)巍膘;
13厂财、存儲(chǔ)年使用YEAR 類(lèi)型
14、存儲(chǔ)日期使用DATE 類(lèi)型
15峡懈、ipv4 地址使用無(wú)符號(hào)整數(shù)存儲(chǔ)璃饱,可通過(guò)函數(shù)INET_ATON() 和 INET_NTOA()轉(zhuǎn)化。
16肪康、在存儲(chǔ)時(shí)間滿(mǎn)足業(yè)務(wù)需求的情況下荚恶,建議使用TIMESTAMP

  • TIMESTAMP 4字節(jié) DATETIME 8字節(jié)
  • 自動(dòng)初始化和更新
  • 時(shí)間范圍不一樣

16、建議字段定義為NOT NULL ,并設(shè)置默認(rèn)值
17磷支、禁止存儲(chǔ)圖片谒撼、文件、視頻等文件
18雾狈、禁止使用外鍵

  • 大數(shù)據(jù)量下性能差廓潜,每次更新都要去檢查維護(hù)
  • 涉及到分表業(yè)務(wù)無(wú)法實(shí)現(xiàn)
  • 外鍵會(huì)導(dǎo)致表結(jié)構(gòu)非常混亂,幾乎是動(dòng)都不能去動(dòng)辩蛋,一層套一層的外鍵約束呻畸,在表很多的情況下很可能會(huì)導(dǎo)致循環(huán)約束
  • 關(guān)聯(lián)數(shù)據(jù)一致可通過(guò)程序保證

19、禁止使用臨時(shí)表
20悼院、可以添加適當(dāng)?shù)娜哂嘧侄翁岣咝阅?br> 21伤为、不建議一個(gè)字段通過(guò)字符串拼接存入多個(gè)值
22、不建議使用bit 類(lèi)型
23据途、不建議使用enum 類(lèi)型
24绞愚、一般是犧牲寫(xiě)操作提升讀操作性能
25、大量數(shù)據(jù)獲取時(shí)需要分頁(yè)昨凡,pageSize 最大1000
26 爽醋、一個(gè)復(fù)雜的查詢(xún)(尤其復(fù)雜的連表)考慮拆分多次查詢(xún)
27、 連接表的順序不是按照語(yǔ)句順序便脊,優(yōu)化器會(huì)重排
28蚂四、標(biāo)志列類(lèi)型和關(guān)聯(lián)表類(lèi)型一致
29、字段唯一的必須添加唯一索引保證哪痰,唯一索引查詢(xún)效率更高
30遂赠、非唯一索引命名規(guī)則:index_字段名稱(chēng)
31、唯一索引字段名稱(chēng)規(guī)則:unique_index_字段名稱(chēng)
32晌杰、索引中的字段數(shù)不超過(guò)5個(gè)
33跷睦、單張表的索引數(shù)不超過(guò)5個(gè)
34、ORDER BY 肋演、GROUP BY 抑诸、DISTINCT 的字段考慮加入索引
35、連表查詢(xún)時(shí)進(jìn)可能保證ORDER BY和GROUP BY 在一個(gè)表中
36爹殊、建議通過(guò)連接取代子查詢(xún)蜕乡,特殊場(chǎng)景具體選擇
37、合理建立聯(lián)合索引梗夸,避免冗余索引
(a层玲、b、c)相當(dāng)于 (a) (a反症、b) (a辛块、b、c)
38铅碍、使用EXPLAIN 判斷sql語(yǔ)句是否合理使用索引润绵,盡量避免extra列出現(xiàn) Using File Sort,Using Temporary
39、合理利用覆蓋索引
40胞谈、盡量擴(kuò)展索引而不是新建索引
41授药、表及字段命名避免使用關(guān)鍵字,如 order士嚎、type 等
42、id自增長(zhǎng)不要求每個(gè)表都需要悔叽,如果有其他字段作為主鍵更適合需求莱衩,則不要id,主鍵設(shè)為指定為改字段
43娇澎、limit 使用時(shí)笨蚁,offset避免過(guò)大,比如limit 100000,10 等趟庄,會(huì)導(dǎo)致掃描過(guò)多行拉高數(shù)據(jù)庫(kù)cpu,尤其涉及到統(tǒng)計(jì)等功能括细。可通過(guò)主鍵id 限制范圍

需要考慮建立索引的字段

1戚啥、where 條件過(guò)濾的字段
2奋单、group by 、order by 猫十、distinct
3览濒、連接的字段

不需要添加索引的情況

1、where 條件中不含有的字段
2拖云、頻繁更改的字段
3贷笛、數(shù)據(jù)重復(fù)多,只含有幾類(lèi)的值宙项,比如性別乏苦,狀態(tài)字段

索引在以下條件是無(wú)效的

1、優(yōu)化器認(rèn)為全表掃描比使用索引快
2尤筐、復(fù)合索引沒(méi)有按照最左原則
3汇荐、使用like 且以通配符開(kāi)始
4、使用not in 盆繁、not like掀淘、<>、!= 等反向查詢(xún)
5改基、使用is null等判斷為空的條件
6繁疤、hash索引使用了范圍查找
7咖为、索引列含有表達(dá)式或者函數(shù)
Select * from order_info where amout+1>100;
SELECT * FROM order_info WHERE length( user_mobile )>10
8秕狰、由Or 連接的,Or前有索引躁染,Or后沒(méi)有索引
SELECT * FROM order_info WHERE user_mobile ='13700000000' OR amount =1000;

詳細(xì)優(yōu)化方案官網(wǎng)介紹:https://dev.mysql.com/doc/refman/8.0/en/optimization.html

查看詳細(xì)計(jì)劃 explain
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

英語(yǔ)閱讀好的鸣哀,建議大家從官網(wǎng)學(xué)習(xí)掌握,對(duì)于常用優(yōu)化的方案都介紹的都比較詳細(xì)吞彤、權(quán)威我衬,而且隨著新版本的發(fā)布新功能優(yōu)化點(diǎn)也會(huì)更新叹放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挠羔,隨后出現(xiàn)的幾起案子井仰,更是在濱河造成了極大的恐慌,老刑警劉巖破加,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俱恶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡范舀,警方通過(guò)查閱死者的電腦和手機(jī)合是,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锭环,“玉大人聪全,你說(shuō)我怎么就攤上這事「ū纾” “怎么了难礼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)汽久。 經(jīng)常有香客問(wèn)我鹤竭,道長(zhǎng),這世上最難降的妖魔是什么景醇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任臀稚,我火速辦了婚禮,結(jié)果婚禮上三痰,老公的妹妹穿的比我還像新娘吧寺。我一直安慰自己,他們只是感情好散劫,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布稚机。 她就那樣靜靜地躺著,像睡著了一般获搏。 火紅的嫁衣襯著肌膚如雪赖条。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天常熙,我揣著相機(jī)與錄音纬乍,去河邊找鬼。 笑死裸卫,一個(gè)胖子當(dāng)著我的面吹牛仿贬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墓贿,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼茧泪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜓氨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起队伟,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤穴吹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嗜侮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刀荒,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年棘钞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缠借。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宜猜,死狀恐怖泼返,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姨拥,我是刑警寧澤绅喉,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站叫乌,受9級(jí)特大地震影響柴罐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜憨奸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一革屠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧排宰,春花似錦似芝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至盐类,卻和暖如春寞奸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背在跳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工枪萄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硬毕。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓呻引,卻偏偏與公主長(zhǎng)得像礼仗,于是被迫代替她去往敵國(guó)和親吐咳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逻悠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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