国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL開發規范與使用技巧總結

MySQL開發規范與使用技巧總結

2020-09-17 17:16徐劉根 Mysql

今天小編就為大家分享一篇關于MySQL開發規范與使用技巧總結,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

1.命名規范

1.庫名、表名、字段名必須使用小寫字母,并采用下劃線分割。

a)MySQL有配置參數lower_case_table_names,不可動態更改,linux系統默認為 0,即庫表名以實際情況存儲,大小寫敏感。如果是1,以小寫存儲,大小寫不敏感。如果是2,以實際情況存儲,但以小寫比較。

b)如果大小寫混合使用,可能存在abc,Abc,ABC等多個表共存,容易導致混亂。

c)字段名顯示區分大小寫,但實際使?用不區分,即不可以建立兩個名字一樣但大小寫不一樣的字段。

d)為了統一規范, 庫名、表名、字段名使用小寫字母。

2.庫名、表名、字段名禁止超過32個字符。

庫名、表名、字段名支持最多64個字符,但為了統一規范、易于辨識以及減少傳輸量,禁止超過32個字符。

3.使用INNODB存儲引擎。

INNODB引擎是MySQL5.5版本以后的默認引擘,支持事務、行級鎖,有更好的數據恢復能力、更好的并發性能,同時對多核、大內存、SSD等硬件支持更好,支持數據熱備份等,因此INNODB相比MyISAM有明顯優勢。

4.庫名、表名、字段名禁止使用MySQL保留字。

當庫名、表名、字段名等屬性含有保留字時,SQL語句必須用反引號引用屬性名稱,這將使得SQL語句書寫、SHELL腳本中變量的轉義等變得?非常復雜。

5.禁止使用分區表。

分區表對分區鍵有嚴格要求;分區表在表變大后,執?行DDL、SHARDING、單表恢復等都變得更加困難。因此禁止使用分區表,并建議業務端手動SHARDING。

6.建議使用UNSIGNED存儲非負數值。

同樣的字節數,非負存儲的數值范圍更大。如TINYINT有符號為 -128-127,無符號為0-255。

7.建議使用INT UNSIGNED存儲IPV4。

用UNSINGED INT存儲IP地址占用4字節,CHAR(15)則占用15字節。另外,計算機處理整數類型比字符串類型快。使用INT UNSIGNED而不是CHAR(15)來存儲IPV4地址,通過MySQL函數inet_ntoa和inet_aton來進行轉化。IPv6地址目前沒有轉化函數,需要使用DECIMAL或兩個BIGINT來存儲。

例如:

?
1
2
SELECT INET_ATON('209.207.224.40'); 3520061480
SELECT INET_NTOA(3520061480); 209.207.224.40

8.強烈建議使用TINYINT來代替ENUM類型。

ENUM類型在需要修改或增加枚舉值時,需要在線DDL,成本較高;ENUM列值如果含有數字類型,可能會引起默認值混淆。

9.使用VARBINARY存儲大小寫敏感的變長字符串或二進制內容。

VARBINARY默認區分大小寫,沒有字符集概念,速度快。

10.INT類型固定占用4字節存儲

例如INT(4)僅代表顯示字符寬度為4位,不代表存儲長度。數值類型括號后面的數字只是表示寬度而跟存儲范圍沒有關系,比如INT(3)默認顯示3位,空格補齊,超出時正常顯示,python、java客戶端等不具備這個功能。

11.區分使用DATETIME和TIMESTAMP。

存儲年使用YEAR類型。存儲日期使用DATE類型。 存儲時間(精確到秒)建議使用TIMESTAMP類型。

DATETIME和TIMESTAMP都是精確到秒,優先選擇TIMESTAMP,因為TIMESTAMP只有4個字節,而DATETIME8個字節。同時TIMESTAMP具有自動賦值以及?自動更新的特性。注意:在5.5和之前的版本中,如果一個表中有多個timestamp列,那么最多只能有一列能具有自動更新功能。

如何使用TIMESTAMP的自動賦值屬性?

a)自動初始化,而且自動更新:

?
1
column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP

b)只是自動初始化:

?
1
column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP

c)自動更新,初始化的值為0:

?
1
column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP

d)初始化的值為0:

?
1
column1 TIMESTAMP DEFAULT 0

12.所有字段均定義為NOT NULL。

a)對表的每一行,每個為NULL的列都需要額外的空間來標識。

b)B樹索引時不會存儲NULL值,所以如果索引字段可以為NULL,索引效率會下降。

c)建議用0、特殊值或空串代替NULL值。

MySQL使用技巧

1.將大字段、訪問頻率低的字段拆分到單獨的表中存儲,分離冷熱數據。

有利于有效利用緩存,防?止讀入無用的冷數據,較少磁盤IO,同時保證熱數據常駐內存提?高緩存命中率。

2.禁止在數據庫中存儲明文密碼。

采用加密字符串存儲密碼,并保證密碼不可解密,同時采用隨機字符串加鹽保證密碼安全。

3.表必須有主鍵,推薦使用UNSIGNED自增列作為主鍵。

表沒有主鍵,INNODB會默認設置隱藏的主鍵列;沒有主鍵的表在定位數據行的時候非常困難,也會降低基于行復制的效率。

4.禁止冗余索引。

索引是雙刃劍,會增加維護負擔,增?大IO壓力。(a,b,c)、(a,b),后者為冗余索引。可以利用前綴索引來達到加速目的,減輕維護負擔。

5.禁止重復索引。

primary key a;uniq index a;重復索引增加維護負擔、占用磁盤空間,同時沒有任何益處。

6.不在低基數列上建立索引,例如“性別”。

大部分場景下,低基數列上建立索引的精確查找,相對于不建立索引的全表掃描沒有任何優勢,而且增大了IO負擔。

7.合理使用覆蓋索引減少IO,避免排序。

覆蓋索引能從索引中獲取需要的所有字段,從?而避免回表進行二次查找,節省IO。

INNODB存儲引擎中,secondary index(非主鍵索引,又稱為輔助索引、二級索引)沒有直接存儲行地址,而是存儲主鍵值。

如果用戶需要查詢secondary index中所不包含的數據列,則需要先通過secondary index查找到主鍵值,然后再通過主鍵查詢到其他數據列,因此需要查詢兩次。覆蓋索引則可以在?一個索引中獲取所有需要的數據,因此效率較高。

例如SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主鍵,適當時候可以將索引添加為index(uid,email),以獲得性能提升。

8.用IN代替OR。SQL語句中IN包含的值不應過多,應少于1000個。

IN是范圍查找,MySQL內部會對IN的列表值進行排序后查找,比OR效率更高。

9.表字符集使用UTF8,必要時可申請使用UTF8MB4字符集。

a)UTF8字符集存儲漢字占用3個字節,存儲英文字符占用一個字節。

b)UTF8統一而且通用,不會出現轉碼出現亂碼風險。

c)如果遇到EMOJ等表情符號的存儲需求,可申請使用UTF8MB4字符集。

10.用UNION ALL代替UNION。

UNION ALL不需要對結果集再進行排序。

11.禁止使用order by rand()。

order by rand()會為表增加一個偽列,然后用rand()函數為每一行數據計算出rand()值,然后基于該行排序,這通常都會生成磁盤上的臨時表,因此效率非常低。建議先使用rand()函數獲得隨機的主鍵值,然后通過主鍵獲取數據。

12.建議使用合理的分頁方式以提高分頁效率。

假如有類似下面分頁語句:

?
1
SELECT * FROM table ORDER BY TIME DESC LIMIT 10000,10;

這種分頁方式會導致大量的io,因為MySQL使用的是提前讀取策略。

推薦分頁方式:

?
1
2
3
SELECT * FROM table WHERE TIME<last_TIME ORDER BY TIME DESC LIMIT 10.
SELECT * FROM table inner JOIN (SELECT id FROM table ORDER BY TIME LIMIT 10000,10) as t
USING(id)

13.SELECT只獲取必要的字段,禁?止使用SELECT *。

減少網絡帶寬消耗;

能有效利用覆蓋索引;

表結構變更對程序基本無影響。

14.SQL中避免出現now()、rand()、sysdate()、current_user()等不確定結果的函數。

語句級復制場景下,引起主從數據不一致;不確定值的函數,產?生的SQL語句無法利用QUERY CACHE。

15.采用合適的分庫分表策略。例如千庫十表、十庫百表等。

采用合適的分庫分表策略,有利于業務發展后期快速對數據庫進行水平拆分,同時分庫可以有效利?用MySQL的多線程復制特性。

16.減少與數據庫交互次數,盡量采用批量SQL語句。

使用下面的語句來減少和db的交互次數:

a)INSERT ... ON DUPLICATE KEY UPDATE

b)REPLACE INTO

c)INSERT IGNORE

d)INSERT INTO VALUES()

17.拆分復雜SQL為多個小SQL,避免大事務。

簡單的SQL容易使?用到MySQL的QUERY CACHE;減少鎖表時間特別是MyISAM;可以使用多核 CPU。

18.對同一個表的多次alter操作必須合并為一次操作。

mysql對表的修改絕大部分操作都需要鎖表并重建表,而鎖表則會對線上業務造成影響。為減少這種影響,必須把對表的多次alter操作合并為一次操作。例如,要給表t增加一個字段b,同時給已有的字段aa建立索引,

通常的做法分為兩步:

?
1
alter table t add column b varchar(10);

然后增加索引:

?
1
alter table t add index idx_aa(aa);

正確的做法是:

?
1
alter table t add column b varchar(10),add index idx_aa(aa);

19.避免使用存儲過程、觸發器、視圖、自定義函數等。

這些高級特性有性能問題,以及未知BUG較多。業務邏輯放到數據庫會造成數據庫的DDL、SCALE OUT、SHARDING等變得更加困難。

20.禁止有super權限的應用程序賬號存在。

安全第一。super權限會導致read only失效,導致較多詭異問題而且很難追蹤。

21.不要在MySQL數據庫中存放業務邏輯。

數據庫是有狀態的服務,變更復雜而且速度慢,如果把業務邏輯放到數據庫中,將會限制業務的快速發展。建議把業務邏輯提前,放到前端或中間邏輯層,而把數據庫作為存儲層,實現邏輯與存儲的分離。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://blog.csdn.net/xlgen157387/article/details/48086607

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲自拍偷拍精品视频 | 在线播放视频一区二区 | 日日天天 | 成人免费av| 亚洲一区精品在线 | 久久久91精品国产一区二区三区 | 日韩精品一区二区三区 | 日日干日日爽 | 五月天伊人 | 黄网站在线观看 | 成人片免费看 | 精品欧美| 视频一区在线播放 | 国产精品ssss在线亚洲 | 成人深夜免费视频 | 久久大香 | 日韩精品久久久久 | 午夜色电影 | 精品国产视频 | 久久亚洲国产精品 | 激情在线视频 | 日日摸夜夜添夜夜添特色大片 | 日本免费黄色 | 色综合视频 | 中文字幕网站 | 亚洲精品www久久久久久广东 | 久久与欧美 | 欧美色综合天天久久综合精品 | 懂色中文一区二区在线播放 | 欧美一区免费 | av网站推荐 | 免费国产网站 | 亚洲精品视频在线 | 久久人爽 | 日韩欧美在线免费观看 | 青青草免费在线视频 | 国产精品一卡二卡 | 国产成人精品免费视频大全最热 | 国产这里只有精品 | 国产精品久久久久久久久 | 亚洲欧美一级久久精品 |