日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

day2-MySQL规约

發布時間:2023/12/31 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day2-MySQL规约 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

如果沒有統一的約定,那么必然會帶來許多額外的工作。例如:JDBC規范。如果沒有這個規范,每個數據庫廠商都各自為政,開發自己的一套與數據庫交互的驅動,那可想而知,對于開發者而言無疑會增加負擔和工作。這里,我們來聊一聊,編碼規范中的MySQL規范。

MySQL規約

建表規約

表或字段命名

  • 必須使用小寫字母或數字。
  • 禁止以數字開頭。
  • 禁止兩個下劃線之間只有數字。
  • 不使用重復名詞。
    即使以逗號分隔的,有集合意義的字段也不要這樣取名。這類字段不應太多。同時如果存儲的值太大,應當作為大字段對待。
  • 禁止使用保留關鍵字。
    避免在某些情況下發生沖突。
  • 是否概念字段,應使用is_xxx命名。
    這個需要注意:在做ORM映射時,字段不要使用isXxx,而應當把is干掉,避免某些框架做Bean解析造成錯誤。而java類型,可以用boolean.
  • 數據類型

    類型含義類型備注
    小數decimal避免計算上的錯誤(小數和整數是單獨存儲的)
    貨幣bigint用最小單位-分,避免小數運算
    字符型char值域長度幾乎相同(不夠長度,自動填空格)
    字符型varchar需要用1-2個字節來記錄長度,最長不要超過5000.與char的區別

    表中必要字段

    id主鍵
    create_time創建時間
    udpate_time更新時間

    推薦規約

  • 表名:業務名稱_表的作用
  • 庫名應當與應用名字保持一致
  • 修改字段含義時,應及時修改該字段的注釋
  • 字段允許冗余,以提高查詢性能,但數據類型必須一致。
    注意,如果單表數據量太大了,因為此時查詢效率更多的受數據量的影響。數據量大的表,可以考慮只做單表查詢,再把其關聯字段通過索引來查詢其他表,如果頻繁查詢的字段可以考慮緩存。
  • 單表超過500萬行,或容量超過2GB,可以考慮分庫分表。
  • 索引規約

    索引的特點:持久性(占用存儲空間)、有序性。
    索引(Index)是幫助數據庫高效獲取數據的數據結構

    索引分類

    按是否存儲數據分:

    • 聚簇索引:葉子節點存儲的是數據。
    • 非聚簇索引:葉子節點存儲的是主鍵。

    按是否帶有唯一約束:

    • 唯一索引
    • 普通索引

    主鍵是唯一標識一個實體的一個屬性或屬性集。
    數據庫會默認給主鍵子彈建立一個比較特殊的索引,既在葉子節點存儲數據,也會帶有一個唯一約束。所以主鍵索引既是聚簇索引,也是唯一索引。通常一個表只有一個聚簇索引,因為數據只存儲一份。

    索引命名規約

    主鍵索引名:pk_表名_字段名
    唯一索引名:uk_表名_字段名
    普通索引名:idx表名_字段名

    創建規約

  • 有唯一特性的字段應當設置唯一約束,基于此,如果該字段還沒有唯一約束,應當建立唯一索引。
  • 在varchar字段上建立索引時,必須指定索引長度。
    說明:索引的長度與區分度是一對矛盾體,一般對字符串類型數據,長度為20的索引,區分度會高達90%以上,可以使用count(distinct left(列名, 索引長度))/count(*)的區分度來確定。
  • 創建組合索引時,區分度最高的在最左邊。
  • 小結

    索引會占用存儲空間
    索引可以提高查詢效率
    索引會影響記錄更新和插入效率

    在創建索引時,應當綜合權衡對查詢效率和更新插入的效率,合理創建索引。因為創建索引需要先排序,所以優先使用天然有序的數據類型。推薦使用數字型數據類型,這樣一來減少空間占用,而來效率高。

    SQL規約

  • 查詢時,應當避免字段隱式類型轉換。想象一下把字段值轉換之后再來做比較,原索引還能用嗎?
  • 利用索引覆蓋,從而避免回表。
  • 需要排序的情況,應盡量利用索引字段的有序性。
  • 禁左模糊、全模糊查詢。真的需要,則使用搜索引擎。
  • 超過三個表禁止 join
    知乎上有大佬說因為MySQL的優化器和執行器都比較弱。
  • 推薦使用count(*),讓優化器來優化。
  • 當某一列全部都是NULL,count(col)返回0,sum(col)返回NULL
  • 分頁查詢時,count=0,應提前返回。
  • 調頁查詢優化,通過延遲關聯或子查詢優化
  • 回表,是指對于像MySQL-innodb引擎這樣的通過聚簇索引來存儲數據的,通過普通索引查詢數據時,需要再更加其葉子節點的主鍵再到主鍵索引中查找數據的過程。
    而像PostgreSQL這樣使用堆表存儲數據的,所有的索引的葉子節點存儲的都是數據在堆表中的坐標,不管是主鍵索引還是普通索引,都是要回表才能取出數據。

    避坑指南

  • 不使用外鍵與級聯,關聯在應用層解決。
  • 禁止使用存儲過程。其拓展性差。
  • 更新/刪除前應先查詢,避免誤刪除。
  • 涉及多張表時,應使用別名。
  • 表的別名前面要有as,并且以t1、t2、t3命名。
  • in的元素個數不宜太多,應當控制好選擇率,避免索引失效。經驗值不超過1000個。
  • 優化目標

    結合Explain,將SQL優化到range級別以上。

    ORM映射規約

  • 在表查詢中,一律不要使用 * 作為查詢的字段列表
  • POJO類的布爾類型,不要使用is前綴。
  • 查詢返回結果都要使用ResultMap映射,避免增加字段時出現遺漏。
  • 不要使用{},避免SQL注入。
  • 不要使用Mybatis的queryForList。據說有坑,對內存不友好。
  • 不使用HashMap接受數據集。
  • 更新表時,必須同時更新update_time。
  • 不要寫一個大而全的接口
    避免更新不需要更新的字段。其一容易出錯,其二效率低,其三增加binlog存儲負擔。
  • 總結

    以上是生活随笔為你收集整理的day2-MySQL规约的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。