国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

讀高性能MySQL(第4版)筆記07_優(yōu)化數(shù)據(jù)類型(下)

這篇具有很好參考價(jià)值的文章主要介紹了讀高性能MySQL(第4版)筆記07_優(yōu)化數(shù)據(jù)類型(下)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

讀高性能MySQL(第4版)筆記07_優(yōu)化數(shù)據(jù)類型(下)文章來源地址http://www.zghlxwxcb.cn/news/detail-707996.html

1.?ENUM(枚舉)

1.1.?MySQL在存儲(chǔ)枚舉時(shí)非常緊湊,會(huì)根據(jù)列表值的數(shù)量壓縮到1或者2字節(jié)中

1.2.?轉(zhuǎn)換為ENUM會(huì)使表變小

1.3.?如果表中有其他索引,減少主鍵大小也會(huì)使這些非主鍵索引小得多

1.4.?ENUM列可以存儲(chǔ)一組預(yù)定義的不同字符串值

1.5.?ENUM字段是根據(jù)內(nèi)部整數(shù)值排序的,而不是根據(jù)字符串本身

1.6.?查詢中使用FIELD()函數(shù)顯式地指定排序順序,但這會(huì)導(dǎo)致MySQL無法利用索引消除排序

1.7.?MySQL將每個(gè)枚舉值存儲(chǔ)為整數(shù),并且必須進(jìn)行查找以將其轉(zhuǎn)換為字符串表示,因此ENUM列有一些開銷

1.8.?將CHAR/VARCHAR列聯(lián)接到ENUM列可能比聯(lián)接到另一個(gè)CHAR/VARCHAR列更慢

1.9.?通常的設(shè)計(jì)實(shí)踐是使用帶有整數(shù)主鍵的“查找表”,以避免在聯(lián)接中使用字符串

1.10.?更改ENUM中的有效值會(huì)導(dǎo)致需要做schema變更

2.?日期和時(shí)間類型

2.1.?MySQL可以存儲(chǔ)的最小時(shí)間粒度是微秒

2.2.?DATETIME

2.2.1.?從1000年到9999年,精度為1微秒

2.2.2.?以YYYYMMDDHHMMSS格式存儲(chǔ)壓縮成整數(shù)的日期和時(shí)間

2.2.3.?與時(shí)區(qū)無關(guān)

2.2.4.?8字節(jié)的存儲(chǔ)空間

2.2.5.?以可排序、無歧義的格式顯示DATETIME值

2.2.6.?ANSI表示日期和時(shí)間的標(biāo)準(zhǔn)方式

2.2.7.?保留日期和時(shí)間的文本表示

2.3.?TIMESTAMP

2.3.1.?自1970年1月1日格林尼治標(biāo)準(zhǔn)時(shí)間(GMT)午夜以來經(jīng)過的秒數(shù)

2.3.1.1.?與UNIX時(shí)間戳相同

2.3.2.?從1970年到2038年1月19日

2.3.2.1.?會(huì)遇到2038年的問題

2.3.2.1.1.?使用帶符號(hào)的32位INT,可以表達(dá)直到2038年的時(shí)間
2.3.2.1.2.?使用無符號(hào)的32位INT,可以表達(dá)直到2106年的時(shí)間
2.3.2.1.3.?使用64位,還可以超出這些范圍

2.3.3.?時(shí)間戳顯示的值依賴于時(shí)區(qū)

2.3.3.1.?MySQL服務(wù)器、操作系統(tǒng)和客戶端連接都有時(shí)區(qū)設(shè)置

2.3.3.2.?存儲(chǔ)值0的TIMESTAMP在美國東部標(biāo)準(zhǔn)時(shí)間(EST)中顯示為1969-12-31 ??19:00:00,與格林尼治標(biāo)準(zhǔn)時(shí)間(GMT)差5小時(shí)

2.3.4.?4字節(jié)的存儲(chǔ)空間

2.3.5.?FROM_UNIXTIME()函數(shù)來將UNIX時(shí)間戳轉(zhuǎn)換為日期

2.3.6.?UNIX_TIMESTAMP()函數(shù)將日期轉(zhuǎn)換為UNIX時(shí)間戳

2.3.7.?保留與所使用時(shí)區(qū)相關(guān)的值

2.3.8.?TIMESTAMP的行為規(guī)則很復(fù)雜,并且在不同的MySQL版本中會(huì)發(fā)生變化,因此你應(yīng)該驗(yàn)證數(shù)據(jù)庫的行為是否符合需要。在對(duì)TIMESTAMP列進(jìn)行更改后,通常最好檢查SHOW CREATE TABLE命令的輸出

2.3.9.?特殊屬性

2.3.9.1.?當(dāng)插入一行記錄時(shí)沒有指定第一個(gè)TIMESTAMP列的值,MySQL會(huì)將該列的值設(shè)置為當(dāng)前時(shí)間

2.3.9.2.?當(dāng)更新一行記錄時(shí)沒有指定第一個(gè)TIMESTAMP列的值,MySQL默認(rèn)也會(huì)將該列的值更新為當(dāng)前時(shí)間

2.3.9.3.?可以為任何TIMESTAMP列配置插入和更新行為

2.3.9.4.?TIMESTAMP列在默認(rèn)情況下為NOT NULL,這也和其他的數(shù)據(jù)類型不一樣

3.?位壓縮數(shù)據(jù)類型

3.1.?從技術(shù)上來說都是字符串類型

3.2.?BIT

3.2.1.?可以使用BIT列存儲(chǔ)一個(gè)或多個(gè)true/false值

3.2.2.?視為字符串類型,而不是數(shù)字類型

3.2.3.?避免使用這種類型

3.2.3.1.?建議使用TINYINT

3.3.?SET

3.3.1.?如果需要存儲(chǔ)多個(gè)true/false值,可以考慮使用MySQL原生的SET數(shù)據(jù)類型

3.3.2.?以一組打包的位的集合來表示的

3.3.3.?更有效地利用存儲(chǔ)空間

3.3.4.?FIND_IN_SET()和FIELD()等函數(shù),使其易于在查詢中使用

3.3.5.?替代方法是使用整數(shù)作為二進(jìn)制位的打包集合

3.3.5.1.?可以在不使用ALTER TABLE的情況下更改字段表示的“枚舉”

3.3.5.2.?查詢更難編寫和理解

4.?JSON數(shù)據(jù)類型

4.1.?決定使用原生SQL還是JSON取決于在數(shù)據(jù)庫中存儲(chǔ)JSON的便捷性是否大于性能

4.2.?如果每天訪問這些數(shù)據(jù)數(shù)百萬次或數(shù)十億次,速度差異就會(huì)累加起來

4.3.?使用SQL列的速度仍然更好于JSON列

5.?標(biāo)識(shí)符

5.1.?引用行及通常使其唯一的方式

5.2.?為標(biāo)識(shí)符列選擇數(shù)據(jù)類型時(shí),應(yīng)該與聯(lián)接表中的對(duì)應(yīng)列保持一致

5.3.?在為標(biāo)識(shí)符列選擇類型時(shí),不僅需要考慮存儲(chǔ)類型,還需要考慮MySQL如何對(duì)該類型執(zhí)行計(jì)算和比較

5.4.?在可以滿足值的范圍的需求,并且預(yù)留未來增長空間的前提下,應(yīng)該選擇最小的數(shù)據(jù)類型

5.5.?整數(shù)通常是標(biāo)識(shí)符的最佳選擇

5.5.1.?速度快

5.5.2.?自動(dòng)遞增

5.6.?對(duì)于標(biāo)識(shí)符來說,ENUM和SET類型通常是糟糕的選擇

5.6.1.?ENUM和SET列適用于保存訂單狀態(tài)或產(chǎn)品類型等信息

5.7.?應(yīng)避免使用字符串類型作為標(biāo)識(shí)符的數(shù)據(jù)類型

5.7.1.?很消耗空間

5.7.2.?比整數(shù)類型慢

5.8.?對(duì)于完全“隨機(jī)”的字符串要非常小心

5.8.1.?MD5()、SHA1()或UUID()生成的字符串

5.9.?新值會(huì)任意分布在很大的空間內(nèi),這會(huì)減慢INSERT和某些類型的SELECT查詢的速度

5.9.1.?插入的值會(huì)寫到索引的隨機(jī)位置,所以會(huì)使得INSERT查詢變慢

5.9.2.?導(dǎo)致頁分裂、磁盤隨機(jī)訪問,以及對(duì)于聚簇存儲(chǔ)引擎產(chǎn)生聚簇索引碎片

5.9.3.?SELECT查詢也會(huì)變慢,因?yàn)檫壿嬌舷噜彽男袝?huì)廣泛分布在磁盤和內(nèi)存中

5.9.4.?對(duì)于所有類型的查詢,隨機(jī)值都會(huì)導(dǎo)致緩存的性能低下,因?yàn)樗鼈儠?huì)破壞引用的局部性,而這正是緩存的工作原理

5.10.?存儲(chǔ)通用唯一標(biāo)識(shí)符(UUID)值,則應(yīng)該刪除破折號(hào)

5.10.1.?更好的做法是,使用UNHEX()函數(shù)將UUID值轉(zhuǎn)換為16字節(jié)的數(shù)字,并將其存儲(chǔ)在一個(gè)BINARY(16)列中

5.10.2.?可以使用HEX()函數(shù)以十六進(jìn)制格式檢索值

6.?特殊數(shù)據(jù)類型

6.1.?IPv4地址

6.1.1.?使用VARCHAR(15)列來存儲(chǔ)

6.1.2.?實(shí)際上是32位無符號(hào)整數(shù),而不是字符串

6.1.2.1.?小數(shù)點(diǎn)將地址分成四段的表示方法只是為了讓人們閱讀容易

6.1.2.2.?存儲(chǔ)為無符號(hào)整數(shù)

6.1.3.?INET_ATON()和INET_NTOA()函數(shù)來在這兩種表示形式之間進(jìn)行轉(zhuǎn)換

6.1.4.?從VARCHAR(15)的約16字節(jié)縮減到無符號(hào)32位整數(shù)的4字節(jié)

7.?schema設(shè)計(jì)中的陷阱

7.1.?太多的列

7.2.?太多的聯(lián)接

7.2.1.?MySQL限制每個(gè)聯(lián)接有61個(gè)表

7.3.?全能的枚舉

7.3.1.?要小心過度使用ENUM

7.4.?變相的枚舉

7.4.1.?ENUM列允許在列中保存一組已定義值中的單個(gè)值

7.4.2.?SET列則允許在列中保存一組已定義值中的一個(gè)或多個(gè)值

7.4.3.?如果真和假兩種情況不會(huì)同時(shí)出現(xiàn),那么毫無疑問應(yīng)該使用ENUM列而不是SET列

7.5.?NULL不是虛擬值

7.5.1.?在表中存儲(chǔ)事實(shí)上的“空值”,可以使用0、特殊值或空字符串作為代替

7.5.2.?當(dāng)需要表示未知值時(shí),不要太害怕使用NULL

7.5.3.?在某些情況下,使用NULL比使用某個(gè)虛擬常數(shù)更好

7.5.4.?MySQL會(huì)對(duì)NULL值進(jìn)行索引,而Oracle則不會(huì)

8.?schema管理

8.1.?修改schema是數(shù)據(jù)庫工程師必須承擔(dān)的最常見任務(wù)之一

8.2.?schema變更管理視為“數(shù)據(jù)存儲(chǔ)平臺(tái)”的一部分

8.3.?盡可能靠近現(xiàn)有的軟件部署工具和工作流程

8.4.?應(yīng)該使用能夠集成針對(duì)schema更改的基本檢測(cè)的工具,以確保滿足一些基線需求

8.5.?如果所在的組織使用多種編程語言且發(fā)展迅速,請(qǐng)確保不會(huì)意外地引入人為瓶頸

8.6.?Skeema是一個(gè)在跨多個(gè)環(huán)境的版本控制中管理schema更改的杰出開源解決方案

8.7.?gh-ost是由GitHub的數(shù)據(jù)工程團(tuán)隊(duì)創(chuàng)建的,專門作為一種管理schema更改過程的解決方案,既不影響服務(wù),也不使用觸發(fā)器

8.7.1.?其使用的是二進(jìn)制日志而不是觸發(fā)跟蹤變化,這是更安全的選擇,所以不必?fù)?dān)心觸發(fā)器的性能影響

到了這里,關(guān)于讀高性能MySQL(第4版)筆記07_優(yōu)化數(shù)據(jù)類型(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 讀高性能MySQL(第4版)筆記12_查詢性能優(yōu)化(下)

    讀高性能MySQL(第4版)筆記12_查詢性能優(yōu)化(下)

    2.3.1.1.?讀取行指針和需要排序的字段,對(duì)其進(jìn)行排序,然后再根據(jù)排序結(jié)果讀取所需要的數(shù)據(jù)行 2.3.1.2.?即需要從數(shù)據(jù)表中讀取兩次數(shù)據(jù),第二次讀取數(shù)據(jù)的時(shí)候,因?yàn)槭亲x取排序列進(jìn)行排序后的所有記錄,這會(huì)產(chǎn)生大量的隨機(jī)I/O,所以兩次傳輸排序的成本非常高 2.3.2.1.?先

    2024年02月08日
    瀏覽(21)
  • 數(shù)據(jù)庫——MySQL高性能優(yōu)化規(guī)范

    所有數(shù)據(jù)庫對(duì)象名稱必須使用小寫字母并用下劃線分割 所有數(shù)據(jù)庫對(duì)象名稱禁止使用 MySQL 保留(如果表名中包含查詢時(shí),需要將其用單引號(hào)括起來) 數(shù)據(jù)庫對(duì)象的命名要能做到見名識(shí)意,并且最后不要超過 32 個(gè)字符 臨時(shí)庫表必須以 tmp_為前綴并以日期為后綴,

    2024年02月11日
    瀏覽(49)
  • 讀高性能MySQL(第4版)筆記05_優(yōu)化服務(wù)器設(shè)置

    讀高性能MySQL(第4版)筆記05_優(yōu)化服務(wù)器設(shè)置

    2.1.3.1.?MySQL只需要少量的內(nèi)存就能保持一個(gè)連接(通常是一個(gè)相關(guān)的專用線程)打開 2.2.1.1.?InnoDB緩沖池大小 2.2.1.2.?需要的內(nèi)存比其他任何組件都多 2.2.1.3.?不僅緩存索引,還緩存行數(shù)據(jù)、自適應(yīng)哈希索引、更改緩沖區(qū)、鎖和其他內(nèi)部結(jié)構(gòu)等 2.2.1.4.?InnoDB嚴(yán)重依賴緩沖池,應(yīng)

    2024年02月09日
    瀏覽(32)
  • 讀高性能MySQL(第4版)筆記04_操作系統(tǒng)和硬件優(yōu)化

    讀高性能MySQL(第4版)筆記04_操作系統(tǒng)和硬件優(yōu)化

    4.9.2.1.?允許在內(nèi)存中更改頁面,而不用將更改刷新到磁盤,這通常涉及隨機(jī)I/O,速度非常慢 4.9.2.2.?將更改的記錄寫入順序日志文件,這樣要快得多 4.9.2.3.?后臺(tái)線程可以稍后將修改過的頁面刷新到磁盤,這樣做可以優(yōu)化寫操作的性能 5.11.2.1.?只有進(jìn)行特殊的擦除操作之后,

    2024年02月09日
    瀏覽(24)
  • 《高性能MYSQL》-- 查詢性能優(yōu)化

    《高性能MYSQL》-- 查詢性能優(yōu)化

    查詢性能優(yōu)化 深刻地理解MySQL如何真正地執(zhí)行查詢,并明白高效和低效的原因何在 查詢的生命周期(不完整):從客戶端到服務(wù)器,然后服務(wù)器上進(jìn)行語法解析,生成執(zhí)行計(jì)劃,執(zhí)行,并給客戶端返回結(jié)果。 一條查詢,如果查詢得很慢,原因大概率是訪問的數(shù)據(jù)太多 對(duì)于低

    2024年03月11日
    瀏覽(99)
  • 高性能MySQL實(shí)戰(zhàn)(三):性能優(yōu)化

    大家好,我是 方圓 。這篇主要介紹對(duì)慢 SQL 優(yōu)化的一些手段,而在講解具體的優(yōu)化措施之前,我想先對(duì) EXPLAIN 進(jìn)行介紹,它是我們?cè)诜治霾樵儠r(shí)必要的操作,理解了它輸出結(jié)果的內(nèi)容更有利于我們優(yōu)化 SQL。為了方便大家的閱讀,在下文中規(guī)定類似 key1 的表示二級(jí)索引,key_

    2024年02月11日
    瀏覽(97)
  • MySQL高性能優(yōu)化規(guī)范建議

    數(shù)據(jù)庫命令規(guī)范 數(shù)據(jù)庫基本設(shè)計(jì)規(guī)范 1. 所有表必須使用 Innodb 存儲(chǔ)引擎 2. 數(shù)據(jù)庫和表的字符集統(tǒng)一使用 UTF8 3. 所有表和字段都需要添加注釋 4. 盡量控制單表數(shù)據(jù)量的大小,建議控制在 500 萬以內(nèi)。 5. 謹(jǐn)慎使用 MySQL 分區(qū)表 6.盡量做到冷熱數(shù)據(jù)分離,減小表的寬度 7. 禁止在表中建

    2024年02月12日
    瀏覽(23)
  • 《高性能MySQL》——?jiǎng)?chuàng)建高性能的索引(筆記)

    《高性能MySQL》——?jiǎng)?chuàng)建高性能的索引(筆記)

    索引(在MySQL中也叫做“鍵(key)”) 是存儲(chǔ)引擎用于快速找到記錄的一種數(shù)據(jù)結(jié)構(gòu)。 索引對(duì)于良好的性能非常關(guān)鍵。尤其是當(dāng)表中的數(shù)據(jù)量越來越大時(shí),索引對(duì)性能的影響愈發(fā)重要。 在數(shù)據(jù)量較小且負(fù)載較低時(shí),不恰當(dāng)?shù)乃饕龑?duì)性能的影響可能還不明顯,但當(dāng)數(shù)據(jù)量逐漸增大時(shí)

    2024年02月07日
    瀏覽(99)
  • 讀高性能MySQL(第4版)筆記08_創(chuàng)建高性能索引(上)

    讀高性能MySQL(第4版)筆記08_創(chuàng)建高性能索引(上)

    2.4.2.1.?按照索引列中的數(shù)據(jù)大小順序存儲(chǔ)的 2.4.3.1.?鍵前綴查找只適用于根據(jù)最左前綴的查找 2.4.4.1.?在查詢某些條件的數(shù)據(jù)時(shí),存儲(chǔ)引擎不再需要進(jìn)行全表掃描 2.4.4.2.?通過比較節(jié)點(diǎn)頁的值和要查找的值可以找到合適的指針進(jìn)入下層子節(jié)點(diǎn),這些指針實(shí)際上定義了子節(jié)點(diǎn)頁中

    2024年02月08日
    瀏覽(97)
  • 讀高性能MySQL(第4版)筆記09_創(chuàng)建高性能索引(下)

    讀高性能MySQL(第4版)筆記09_創(chuàng)建高性能索引(下)

    1.4.4.1.?InnoDB的二級(jí)索引在葉子節(jié)點(diǎn)中保存了記錄的主鍵值,所以如果二級(jí)索引能夠覆蓋查詢,則可以避免對(duì)主鍵索引的二次查詢 7.1.5.1.?常見的類似錯(cuò)誤通常是由于嘗試使用rsync備份InnoDB導(dǎo)致的 7.3.3.1.?否則,對(duì)于范圍查詢、索引覆蓋掃描等操作來說,速度可能會(huì)降低很多 7

    2024年02月08日
    瀏覽(101)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包