《阿里巴巴Java開發(fā)手冊(cè)(正式版)》 學(xué)習(xí)筆記 - MySQL

MySQL 相關(guān)學(xué)習(xí)筆記

  1. MySQL 基本操作

摘要: 阿里巴巴集團(tuán)推出的《阿里巴巴Java開發(fā)手冊(cè)(正式版)》是阿里巴巴近萬(wàn)名開發(fā)同學(xué)集體智慧的結(jié)晶,以開發(fā)視角為中心,詳細(xì)列舉如何開發(fā)更加高效、更加容錯(cuò)、更加有協(xié)作性,力求知其然,更知其不然,結(jié)合正反例,讓Java開發(fā)者能夠提升協(xié)作效率、提高代碼質(zhì)量。

作為一個(gè) Java 開發(fā)人員,我花了一天時(shí)間閱讀了這個(gè)開發(fā)手冊(cè),摘要了一些對(duì)于我有用的知識(shí)點(diǎn)。記錄如下,僅供參考。

MySQL

1. 建表規(guī)約

  1. 表達(dá)是與否概念的字段,必須使用 is_xxx 的方式命名,數(shù)據(jù)類型是 unsigned tinyint ( 1 表示是,0 表示否)。
    說(shuō)明:任何字段如果為非負(fù)數(shù),必須是 unsigned
  • 表名、字段名必須使用小寫字母或數(shù)字;禁止出現(xiàn)數(shù)字開頭,禁止兩個(gè)下劃線中間只出現(xiàn)數(shù)字。
    正例:getter_admin,task_configlevel3_name
    反例:GetterAdmin,taskConfiglevel_3_name
  • 表名不使用復(fù)數(shù)名詞。
    說(shuō)明:表名應(yīng)該僅僅表示表里面的實(shí)體內(nèi)容,不應(yīng)該表示實(shí)體數(shù)量,對(duì)應(yīng)于 DO 類名也是單數(shù)形式,符合表達(dá)習(xí)慣。
  • 唯一索引名為 uk_xxx 字段名;普通索引名則為 idx_xxx 字段名。
    說(shuō)明:uk_xxx 即 unique key;idx_xxx 即 index 的簡(jiǎn)稱。
  • 小數(shù)類型為 decimal,禁止使用 floatdouble
    說(shuō)明:floatdouble 在存儲(chǔ)的時(shí)候,存在精度損失的問(wèn)題,很可能在值的比較時(shí),得到不正確的結(jié)果。如果存儲(chǔ)的數(shù)據(jù)范圍超過(guò) decimal 的范圍,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開存儲(chǔ)。
  • 如果存儲(chǔ)的字符串長(zhǎng)度幾乎相等,使用 char 定長(zhǎng)字符串類型。
  • varchar 是可變長(zhǎng)字符串,不預(yù)先分配存儲(chǔ)空間,長(zhǎng)度不要超過(guò) 5000,如果存儲(chǔ)長(zhǎng)度大于此值,定義字段類型為 text,獨(dú)立出來(lái)一張表,用主鍵來(lái)對(duì)應(yīng),避免影響其它字段索引效率。
  • 字段允許適當(dāng)冗余,以提高性能,但是必須考慮數(shù)據(jù)同步的情況。冗余字段應(yīng)遵循:
    1)不是頻繁修改的字段。
    2)不是 varchar 超長(zhǎng)字段,更不能是 text 字段。
    正例:商品類目名稱使用頻率高,字段長(zhǎng)度短,名稱基本一成不變,可在相關(guān)聯(lián)的表中冗余存儲(chǔ)類目名稱,避免關(guān)聯(lián)查詢。

2. 索引規(guī)約

  1. 業(yè)務(wù)上具有唯一特性的字段,即使是組合字段,也必須建成唯一索引。
    說(shuō)明:不要以為唯一索引影響了 insert 速度,這個(gè)速度損耗可以忽略,但提高查找速度是明顯的;另外,即使在應(yīng)用層做了非常完善的校驗(yàn)和控制,只要沒有唯一索引,根據(jù)墨菲定律,必然有臟數(shù)據(jù)產(chǎn)生。
  • varchar 字段上建立索引時(shí),必須指定索引長(zhǎng)度,沒必要對(duì)全字段建立索引,根據(jù)實(shí)際文本區(qū)分度決定索引長(zhǎng)度。
    說(shuō)明:索引的長(zhǎng)度與區(qū)分度是一對(duì)矛盾體,一般對(duì)字符串類型數(shù)據(jù),長(zhǎng)度為 20 的索引,區(qū)分度會(huì)高達(dá) 90%以上,可以使用 count(distinct left(列名, 索引長(zhǎng)度))/count(*) 的區(qū)分度來(lái)確定。
  • 頁(yè)面搜索嚴(yán)禁左模糊或者全模糊,如果需要請(qǐng)走搜索引擎來(lái)解決。
    說(shuō)明:索引文件具有 B-Tree 的最左前綴匹配特性,如果左邊的值未確定,那么無(wú)法使用此索引。
  • 如果有 order by 的場(chǎng)景,請(qǐng)注意利用索引的有序性。order by 最后的字段是組合索引的一部分,并且放在索引組合順序的最后,避免出現(xiàn) file_sort 的情況,影響查詢性能。
    正例:where a=? and b=? order by c; 索引:a_b_c
  • 利用延遲關(guān)聯(lián)或者子查詢優(yōu)化超多分頁(yè)場(chǎng)景。
    說(shuō)明:MySQL 并不是跳過(guò) offset 行,而是取 offset+N 行,然后返回放棄前 offset 行,返回 N 行,那當(dāng) offset 特別大的時(shí)候,效率就非常的低下,要么控制返回的總頁(yè)數(shù),要么對(duì)超過(guò)特定閾值的頁(yè)數(shù)進(jìn)行 SQL 改寫。
    正例:先快速定位需要獲取的 id 段,然后再關(guān)聯(lián):
    SELECT a.* FROM 表 1 a, (select id from 表 1 where 條件 LIMIT 100000,20 ) b where a.id=b.id
  • 建組合索引的時(shí)候,區(qū)分度最高的在最左邊。

3. SQL 規(guī)約

  1. 不要使用 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 值的行。
  • count(distinct col) 計(jì)算該列除 NULL 之外的不重復(fù)數(shù)量。
    注意 count(distinct col1, col2) 如果其中一列全為 NULL,那么即使另一列有不同的值,也返回為 0。
  • 使用 ISNULL() 來(lái)判斷是否為 NULL 值。注意:NULL 與任何值的直接比較都為 NULL
    說(shuō)明:
    1) NULL<>NULL 的返回結(jié)果是 NULL,而不是 false
    2) NULL=NULL 的返回結(jié)果是 NULL,而不是 true。
    3) NULL<>1 的返回結(jié)果是 NULL,而不是 true。
  • 如果有全球化需要,所有的字符存儲(chǔ)與表示,均以 utf-8 編碼,那么字符計(jì)數(shù)方法注意:
    說(shuō)明:
    SELECT LENGTH("輕松工作"); 返回為 12
    SELECT CHARACTER_LENGTH("輕松工作"); 返回為 4
    如果要使用表情,那么使用 utfmb4 來(lái)進(jìn)行存儲(chǔ),注意它與 utf-8 編碼的區(qū)別。
  • TRUNCATE TABLEDELETE 速度快,且使用的系統(tǒng)和事務(wù)日志資源少,但 TRUNCATE 無(wú)事務(wù)且不觸發(fā) trigger,有可能造成事故,故不建議在開發(fā)代碼中使用此語(yǔ)句。

4. ORM 規(guī)約

  1. 在表查詢中,一律不要使用 * 作為查詢的字段列表,需要哪些字段必須明確寫明。
    說(shuō)明:1)增加查詢分析器解析成本。2)增減字段容易與 resultMap 配置不一致。
  • POJO 類的 boolean 屬性不能加 is,而數(shù)據(jù)庫(kù)字段必須加 is_,要求在 resultMap 中進(jìn)行字段與屬性之間的映射。
  • xml 配置中參數(shù)注意使用:#{}#param# 不要使用 ${} 此種方式容易出現(xiàn) SQL 注入。
  • 不要寫一個(gè)大而全的數(shù)據(jù)更新接口,傳入為 POJO 類,不管是不是自己的目標(biāo)更新字段,都進(jìn)行 update table set c1=value1,c2=value2,c3=value3; 這是不對(duì)的。執(zhí)行 SQL 時(shí),盡量不要更新無(wú)改動(dòng)的字段,一是易出錯(cuò);二是效率低;三是 binlog 增加存儲(chǔ)。

引用:
【Java編碼規(guī)范】《阿里巴巴Java開發(fā)手冊(cè)(正式版)》發(fā)布!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 來(lái)源與:阿里云棲 禁止用于商業(yè)用途 ps:如果需要電子書 評(píng)論你們郵箱 我會(huì)發(fā)給你們 下面感覺還是有點(diǎn)亂 目錄 一...
    小向資源網(wǎng)閱讀 7,847評(píng)論 0 12
  • (二)日志規(guī)約 1.【強(qiáng)制】應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的API,而應(yīng)依賴使用日志框...
    owen_he閱讀 1,129評(píng)論 0 0
  • 什么是數(shù)據(jù)庫(kù)? 數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建,訪問(wèn),管理...
    chen_000閱讀 4,155評(píng)論 0 19
  • 之前的文章一直在規(guī)避索引的建立去優(yōu)化數(shù)據(jù)庫(kù),不是不想講,而是這個(gè)太重要,必須抽出來(lái)講。今天我們就來(lái)研究下數(shù)據(jù)庫(kù)索引...
    JackFrost_fuzhu閱讀 4,833評(píng)論 0 70
  • 不知道你有沒有情緒管理問(wèn)題 總之我有 我身邊的朋友或多或少也會(huì)有 我們最常出現(xiàn)的三種問(wèn)題是: 容易被小事激怒 生氣...
    無(wú)聊小事閱讀 500評(píng)論 0 1

友情鏈接更多精彩內(nèi)容