日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

MySQL開發(fā)規(guī)范之我見

瀏覽:133日期:2023-10-16 19:25:31

大多數(shù)MySQL規(guī)范在網(wǎng)上也都能找得到相關(guān)的分享,在這里要分享的是老葉個人認(rèn)為比較重要的,或者容易被忽視的,以及容易被混淆的一些地方。

MySQL開發(fā)規(guī)范之我見

1、默認(rèn)使用InnoDB引擎

【老葉觀點】已多次呼吁過了,InnoDB適用于幾乎99%的MySQL應(yīng)用場景,而且在MySQL 5.7的系統(tǒng)表都改成InnoDB了,還有什么理由再死守MyISAM呢。

此外,頻繁讀寫的InnoDB表,一定要使用具有自增/順序特征的整型作為顯式主鍵。

參考】:[MySQL FAQ]系列 — 為什么InnoDB表要建議用自增列做主鍵。

2、字符集選擇utf-8

【老葉觀點】若為了節(jié)省磁盤空間,則建議選擇latin1。建議選擇utf-8通常是為了所謂的“通用性”,但事實上用戶提交的utf-8數(shù)據(jù)也一樣可以以latin1字符集存儲。

用latin1存儲utf-8數(shù)據(jù)可能遇到的麻煩是,如果有基于中文的檢索時,可能無法100%準(zhǔn)確(老葉親自簡單測試常規(guī)的中文完檢索全不是問題,也就是一般的中文對比是沒問題的)。

用latin1字符集存儲utf-8數(shù)據(jù)的做法是:在web端(用戶端)的字符集是utf-8,后端程序也采用utf-8來處理,但 character_set_client、character_set_connection、character_set_results、character_set_database、character_set_server 這幾個都是 latin1,且數(shù)據(jù)表、字段的字符集也是latin1。或者說數(shù)據(jù)表采用latin1,每次連接后執(zhí)行 SET NAMES LATIN1 即可。

參考】:小談MySQL字符集。

3、InnoDB表行記錄物理長度不超過8KB

【老葉觀點】InnoDB的data page默認(rèn)是16KB,基于B+Tree的特點,一個data page中需要至少存儲2條記錄。因此,當(dāng)實際存儲長度超過8KB(尤其是TEXT/BLOB列)的大列(large column)時會引起“page-overflow存儲”,類似ORACLE中的“行遷移”。

因此,如果必須使用大列(尤其是TEXT/BLOB類型)且讀寫頻繁的話,則最好把這些列拆分到子表中,不要和主表放在一起存儲。如果不太頻繁,可以考慮繼續(xù)保留在主表中。

當(dāng)然了,如果將 innodb_page_size 選項修改成 8KB,那么行記錄物理長度建議不超過4KB。

參考】:[MySQL優(yōu)化案例]系列 — 優(yōu)化InnoDB表BLOB列的存儲效率。

4、是否使用分區(qū)表

【老葉觀點】在一些使用分區(qū)表后明顯可以提升性能或者運(yùn)維便利性的場景下,還是建議使用分區(qū)表。

比如老葉就在zabbix的數(shù)據(jù)庫采用TokuDB引擎的前提下,又根據(jù)時間維度使用了分區(qū)表。這樣的好處是保證zabbix日常應(yīng)用不受到影響前提下,方便管理員例行刪除過去數(shù)據(jù),只需要刪除相應(yīng)分區(qū)即可,不需再執(zhí)行一個非常慢的DELETE而影響整體性能。

參考】:遷移Zabbix數(shù)據(jù)庫到TokuDB。

5、是否使用存儲過程、觸發(fā)器

【老葉觀點】在一些合適的場景下,用存儲過程、觸發(fā)器也完全沒問題。

我們以前就是利用存儲完成游戲業(yè)務(wù)邏輯處理,性能上不是問題,而且一旦需求有變更,只需修改存儲過程,變更代價很低。我們還利用觸發(fā)器維護(hù)一個頻繁更新的表,對這個表的所有變更都將部分字段同步更新到另一個表中(類似物化視圖的變相實現(xiàn)),也不存在性能問題。

不要把MySQL的存儲過程和觸發(fā)器視為洪水猛獸,用好的話,沒有問題的,真遇到問題了再優(yōu)化也不遲。另外,MySQL因為沒有物化視圖,因此視圖能不用就盡量少用吧。

6、選擇合適的類型

【老葉觀點】除了常見的建議外,還有其他幾個要點:

6.1、用INT UNSIGNED存儲IPV4地址,用INET_ATON()、INET_NTOA()進(jìn)行轉(zhuǎn)換,基本上沒必要使用CHAR(15)來存儲。

6.2、枚舉類型可以使用ENUM,ENUM的內(nèi)部存儲機(jī)制是采用TINYINT或SMALLINT(并非CHAR/VARCHAR),性能一點都不差,記住千萬別用CHAR/VARCHAR 來存儲枚舉數(shù)據(jù)。

6.3、還個早前一直在傳播的“常識性誤導(dǎo)”,建議用TIMESTAMP取代DATETIME。其實從5.6開始,建議優(yōu)先選擇DATETIME存儲日期時間,因為它的可用范圍比TIMESTAMP更大,物理存儲上僅比TIMESTAMP多1個字節(jié),整體性能上的損失并不大。

6.4、所有字段定義中,默認(rèn)都加上NOT NULL約束,除非必須為NULL(但我也想不出來什么場景下必須要在數(shù)據(jù)庫中存儲NULL值,可以用0來表示)。在對該字段進(jìn)行COUNT()統(tǒng)計時,統(tǒng)計結(jié)果更準(zhǔn)確(值為NULL的不會被COUNT統(tǒng)計進(jìn)去),或者執(zhí)行 WHERE column IS NULL 檢索時,也可以快速返回結(jié)果。

6.5、盡可能不要直接 SELECT * 讀取全部字段,尤其是表中存在 TEXT/BLOB 大列的時候。可能本來不需要讀取這些列,但因為偷懶寫成 SELECT * 導(dǎo)致內(nèi)存buffer pool被這些“垃圾”數(shù)據(jù)把真正需要緩沖起來的熱點數(shù)據(jù)給洗出去了。

8、關(guān)于索引

【老葉觀點】除了常見的建議外,還有幾個要點:

8.1、超過20個長度的字符串列,最好創(chuàng)建前綴索引而非整列索引(例如:ALTER TABLE t1 ADD INDEX(user(20))),可以有效提高索引利用率,不過它的缺點是對這個列排序時用不到前綴索引。前綴索引的長度可以基于對該字段的統(tǒng)計得出,一般略大于平均長度一點就可以了。

8.2、定期用 pt-duplicate-key-checker 工具檢查并刪除重復(fù)的索引。比如 index idx1(a, b) 索引已經(jīng)涵蓋了 index idx2(a),就可以刪除 idx2 索引了。

8.3、有多字段聯(lián)合索引時,WHERE中過濾條件的字段順序無需和索引一致,但如果有排序、分組則就必須一致了。

比如有聯(lián)合索引 idx1(a, b, c),那么下面的SQL都可以完整用到索引

SELECT ... WHERE b = ? AND c = ? AND a = ?; --注意到,WHERE中字段順序并沒有和索引字段順序一致SELECT ... WHERE b = ? AND a = ? AND c = ?;SELECT ... WHERE a = ? AND b IN (?, ?) AND c = ?;SELECT ... WHERE a = ? AND b = ? ORDER BY c;SELECT ... WHERE a = ? AND b IN (?, ?) ORDER BY c;SELECT ... WHERE a = ? ORDER BY b, c;SELECT ... ORDER BY a, b, c; -- 可利用聯(lián)合索引完成排序

而下面幾個SQL則只能用到部分索引

SELECT ... WHERE b = ? AND a = ?; -- 只能用到 (a, b) 部分SELECT ... WHERE a IN (?, ?) AND b = ?; -- 只能用到 (a, b) 部分SELECT ... WHERE a = ? AND c = ?; -- 只能用到 (a) 部分SELECT ... WHERE a = ? AND b IN (?, ?); -- 只能用到 (a, b) 部分SELECT ... WHERE (a BETWEEN ? AND ?) AND b = ?; -- 只能用到 (a) 部分,注意BETWEEN和IN的區(qū)別SELECT ... WHERE a = ? AND (b BETWEEN ? AND ?) AND c = ?; -- 只能用到 (a, b) 部分

下面的幾個SQL完全用不到該索引

SELECT ... WHERE b = ?;SELECT ... WHERE b = ? AND c = ?;SELECT ... WHERE b = ? AND c = ?;SELECT ... ORDER BY b;SELECT ... ORDER BY b, a;

從上面的幾個例子就能看的出來,以往強(qiáng)調(diào)的WHERE條件字段順序要和索引順序一致才能使用索引的 “常識性誤導(dǎo)” 無需嚴(yán)格遵守。

此外,有些時候查詢優(yōu)化器指定的索引或執(zhí)行計劃可能并不是最優(yōu)的,可以手工指定最優(yōu)索引,或者修改session級的 optimizer_switch 選項,關(guān)閉某些導(dǎo)致效果反而更差的特性(比如index merge通常是好事,但也遇到過用上index merge后反而更差的,這時候要么強(qiáng)制指定其中一個索引,要么可以臨時關(guān)閉 index merge 特性)。

9、其他

9.1、哪怕是基于索引的條件過濾,如果優(yōu)化器意識到總共需要掃描的數(shù)據(jù)量超過30%時(ORACLE里貌似是20%,MySQL目前是30%,沒準(zhǔn)以后會調(diào)整),就會直接改變執(zhí)行計劃為全表掃描,不再使用索引。

9.2、多表JOIN時,要把過濾性最大(不一定是數(shù)據(jù)量最小哦,而是只加了WHERE條件后過濾性最大的那個)的表選為驅(qū)動表。此外,如果JOIN之后有排序,排序字段一定要屬于驅(qū)動表,才能利用驅(qū)動表上的索引完成排序。

9.3、絕大多數(shù)情況下,排序的大家通常要來的更高,因此如果看到執(zhí)行計劃中有 Using filesort,優(yōu)先創(chuàng)建排序索引吧。

9.4、利用 pt-query-digest 定期分析slow query log,并結(jié)合 Box Anemometer 構(gòu)建slow query log分析及優(yōu)化系統(tǒng)。

參考】:[MySQL FAQ]系列 — EXPLAIN結(jié)果中哪些信息要引起關(guān)注。

備注:若無特別說明,以上規(guī)范建議適用于MySQL 5.6及之前的版本。5.7及之后的版本可能會有些變化,個別規(guī)范建議需要相應(yīng)調(diào)整。

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
韩国女主播一区二区三区| 久久精品超碰| 欧美日韩一区二区三区在线电影| 在线一区欧美| 中文欧美日韩| 亚洲精品免费观看| 欧美日韩调教| 国产盗摄——sm在线视频| 欧美精选视频一区二区| 日韩一级欧洲| 日本视频一区二区| 成人综合一区| 精品91久久久久| 亚洲精品少妇| 麻豆国产一区| 亚洲小说欧美另类婷婷| 香蕉久久一区| 精品视频在线观看网站| 久久精品二区三区| 国产精品呻吟| 国产亚洲观看| 久久久久国产| 日韩一区精品| 日韩美女一区二区三区在线观看| 黑丝一区二区三区| 久久的色偷偷| 欧美不卡高清| 日韩福利视频一区| 激情国产在线| 亚洲精品日本| 亚洲电影有码| 日本成人在线视频网站| 色婷婷亚洲mv天堂mv在影片| 国产主播一区| 国产情侣久久| 精品91久久久久| 欧美aⅴ一区二区三区视频| 欧美 日韩 国产一区二区在线视频| 少妇精品久久久一区二区三区| 久久尤物视频| 久热精品在线| 岛国av免费在线观看| 综合激情五月婷婷| 97se综合| 日韩av中文字幕一区二区| 久久国产电影| 欧美xxxx性| 国产美女一区| 国产h片在线观看| 欧美日韩1区2区3区| 日韩一级精品| 麻豆精品蜜桃| 国产精品对白| 日韩在线一区二区| 欧美精品日日操| 麻豆视频观看网址久久| 亚洲毛片网站| 国产精品99一区二区| 麻豆精品在线播放| 日韩精品免费观看视频| 美女少妇全过程你懂的久久| 精品久久国产一区| 日韩超碰人人爽人人做人人添| 999国产精品永久免费视频app| 国产精品白丝久久av网站| 日韩中文字幕麻豆| 亚洲手机视频| 老牛影视精品| 欧美黑人做爰爽爽爽| 一区二区三区午夜视频| 好看的亚洲午夜视频在线| 欧美日韩免费观看视频| 久久99精品久久久野外观看| 日本综合精品一区| 最新国产精品| 亚洲香蕉久久| 老司机久久99久久精品播放免费| 久久久精品五月天| 国产一区二区三区不卡视频网站| 国产日韩欧美高清免费| 日日夜夜免费精品视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲福利一区| 91精品国产调教在线观看| 神马午夜在线视频| 在线中文字幕播放| 一区二区三区四区日本视频| 国产精品成人一区二区不卡| 免费在线亚洲欧美| 久久精品一区| 国产一区二区视频在线看| 美女毛片一区二区三区四区最新中文字幕亚洲| 视频精品一区二区| 视频一区中文字幕| 日韩中文字幕1| 亚洲麻豆一区| 日本免费在线视频不卡一不卡二| 日韩在线黄色| 国产精品亚洲产品| 久久精品国产免费| 成人午夜网址| 欧美羞羞视频| 欧美高清不卡| 一区二区三区四区在线观看国产日韩 | 视频一区二区三区中文字幕| 红桃视频欧美| 欧美日韩国产欧| 99视频精品免费观看| 久久国产精品99国产| 一区二区三区四区日韩| 日韩在线黄色| 国产精品mv在线观看| 久久女人天堂| 日韩电影在线视频| 国产真实久久| 老鸭窝毛片一区二区三区| 亚洲综合激情在线| 国产美女视频一区二区| 国产videos久久| 国产91一区| 亚洲理论在线| 国产丝袜一区| 97精品国产一区二区三区| 欧美午夜精彩| 中文字幕日本一区| 国产精品久久免费视频| 欧美日韩免费观看视频| 久久高清国产| 久久av综合| 国产高清一区二区| 乱人伦精品视频在线观看| 日本精品在线播放| 成人日韩av| 精品一区在线| 日韩国产欧美在线播放| 国产专区精品| 伊人久久大香线蕉av不卡| 午夜一区在线| 精品伊人久久| 欧美日韩高清| 91亚洲精品视频在线观看| 日韩国产激情| 亚洲精品进入| 欧美片第1页| 日韩激情综合| 91精品一区二区三区综合| 日韩一二三区在线观看| 国产精品麻豆久久| 色狠狠一区二区三区| 日本免费一区二区三区四区| 香蕉久久久久久| 风间由美中文字幕在线看视频国产欧美| 99国产精品一区二区| 亚洲精品乱码| 久久亚洲专区| 国产激情欧美| 午夜亚洲一区| 日韩在线短视频| 国产伦理久久久久久妇女| 1024精品久久久久久久久| 国产美女亚洲精品7777| 狠狠色狠狠色综合日日tαg| 国产一区二区三区精品在线观看| 亚洲欧洲日韩精品在线| 激情偷拍久久| аⅴ资源天堂资源库在线| 亚洲一区二区三区四区电影| 色偷偷色偷偷色偷偷在线视频| 日本v片在线高清不卡在线观看| 国模 一区 二区 三区| 国际精品欧美精品| 91精品福利观看| 石原莉奈在线亚洲三区| 99视频精品全部免费在线视频| 麻豆中文一区二区| 日本成人手机在线| 亚洲欧美日韩在线观看a三区| 午夜av不卡| 老司机免费视频一区二区| 日韩欧美四区| 蜜臀av在线播放一区二区三区| 亚洲国产成人二区| 久久伊人久久| 国产精品日本一区二区不卡视频| 一区二区三区四区在线观看国产日韩| 久久久一本精品| 精品欠久久久中文字幕加勒比| 亚洲精选久久| 视频精品一区二区| 在线亚洲自拍| 中文亚洲欧美| 日韩一区二区免费看| 欧美 日韩 国产一区二区在线视频 | 欧美精品1区| 日精品一区二区三区| 蜜臀久久久久久久| 久久亚洲国产精品一区二区| 好吊日精品视频| 午夜免费一区| 蜜桃tv一区二区三区|