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

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

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

讀高性能MySQL(第4版)筆記11_查詢性能優(yōu)化(中)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-709935.html

1.?MySQL的客戶端/服務(wù)器通信協(xié)議

1.1.?MySQL的客戶端和服務(wù)器之間的通信協(xié)議是“半雙工”的

1.2.?在任何時(shí)刻,要么是由服務(wù)器向客戶端發(fā)送數(shù)據(jù),要么是由客戶端向服務(wù)器發(fā)送數(shù)據(jù),這兩個(gè)動(dòng)作不能同時(shí)發(fā)生

1.3.?當(dāng)查詢的語(yǔ)句很長(zhǎng)的時(shí)候,參數(shù)max_allowed_packet就特別重要了

1.4.?一般的服務(wù)器響應(yīng)給用戶的數(shù)據(jù)通常很多,由多個(gè)數(shù)據(jù)包組成

1.5.?當(dāng)服務(wù)器開(kāi)始響應(yīng)客戶端請(qǐng)求時(shí),客戶端必須完整地接收整個(gè)返回結(jié)果,而不能簡(jiǎn)單地只取前面幾條結(jié)果,然后讓服務(wù)器停止發(fā)送數(shù)據(jù)

1.5.1.?在必要的時(shí)候一定要在查詢中加上LIMIT限制

1.6.?當(dāng)客戶端從服務(wù)器取數(shù)據(jù)時(shí),看起來(lái)是一個(gè)拉數(shù)據(jù)的過(guò)程,但實(shí)際上是MySQL在向客戶端推送數(shù)據(jù)的過(guò)程

1.7.?MySQL通常需要等所有的數(shù)據(jù)都已經(jīng)發(fā)送給客戶端才能釋放這條查詢所占用的資源,所以接收全部結(jié)果并緩存通??梢詼p少服務(wù)器的壓力,讓查詢能夠早點(diǎn)結(jié)束、早點(diǎn)釋放相應(yīng)的資源

1.8.?當(dāng)使用多數(shù)連接MySQL的庫(kù)函數(shù)從MySQL獲取數(shù)據(jù)時(shí),其結(jié)果看起來(lái)都像是從MySQL服務(wù)器獲取數(shù)據(jù),而實(shí)際上都是從這個(gè)庫(kù)函數(shù)的緩存獲取數(shù)據(jù)

1.9.?如果能夠盡早開(kāi)始處理這些結(jié)果集,就能大大減少內(nèi)存的消耗,在這種情況下可以不使用緩存來(lái)記錄結(jié)果而是直接處理

1.9.1.?對(duì)于服務(wù)器來(lái)說(shuō),需要查詢完成后才能釋放資源,所以在和客戶端交互的整個(gè)過(guò)程中,服務(wù)器的資源都是被這個(gè)查詢所占用的

1.9.2.?用mysql_unbuffered_query()代替mysql_query(),PHP則不會(huì)緩存結(jié)果

2.?SHOW FULL PROCESSLIST命令

2.1.?該命令返回結(jié)果中的Command列,其就表示當(dāng)前的狀態(tài)

2.2.?Sleep

2.2.1.?線程正在等待客戶端發(fā)送新的請(qǐng)求

2.3.?Query

2.3.1.?線程正在執(zhí)行查詢或者正在將結(jié)果發(fā)送給客戶端

2.4.?Locked

2.4.1.?在MySQL服務(wù)器層,該線程正在等待表鎖

2.5.?Analyzing and statistics

2.5.1.?線程正在檢查存儲(chǔ)引擎的統(tǒng)計(jì)信息,并優(yōu)化查詢

2.6.?Copying to tmp table [on disk]

2.6.1.?線程正在執(zhí)行查詢,并且將其結(jié)果集復(fù)制到一個(gè)臨時(shí)表中

2.6.2.?么是在做GROUP BY操作

2.6.3.?要么是在進(jìn)行文件排序操作

2.6.4.?或者是在進(jìn)行UNION操作

2.6.5.?“on disk”標(biāo)記,那表示MySQL正在將一個(gè)內(nèi)存臨時(shí)表放到磁盤上

2.7.?Sorting result

2.7.1.?線程正在對(duì)結(jié)果集進(jìn)行排序

3.?導(dǎo)致MySQL優(yōu)化器選擇錯(cuò)誤的執(zhí)行計(jì)劃

3.1.?統(tǒng)計(jì)信息不準(zhǔn)確

3.1.1.?MySQL服務(wù)器依賴存儲(chǔ)引擎提供的統(tǒng)計(jì)信息來(lái)評(píng)估成本,但是有的存儲(chǔ)引擎提供的信息是準(zhǔn)確的,有的偏差可能非常大

3.2.?成本指標(biāo)并不完全等同于運(yùn)行查詢的實(shí)際成本

3.3.?MySQL的最優(yōu)可能和你想的最優(yōu)不一樣

3.3.1.?MySQL只是基于其成本模型選擇最優(yōu)的執(zhí)行計(jì)劃,而有些時(shí)候這并不是最快的執(zhí)行方式

3.4.?MySQL從不考慮其他并發(fā)執(zhí)行的查詢,這可能會(huì)影響到當(dāng)前查詢的速度

3.5.?MySQL也并不是任何時(shí)候都是基于成本的優(yōu)化

3.5.1.?如果存在全文搜索的MATCH()子句,則在存在FULLTEXT索引的時(shí)候就使用全文索引

3.5.2.?即使有時(shí)候使用其他索引和WHERE條件可以遠(yuǎn)比這種方式要快,MySQL也仍然會(huì)使用對(duì)應(yīng)的全文索引

3.6.?MySQL不會(huì)考慮不受其控制的操作的成本

3.6.1.?執(zhí)行存儲(chǔ)函數(shù)或者用戶自定義函數(shù)的成本

4.?優(yōu)化策略

4.1.?靜態(tài)優(yōu)化

4.1.1.?不依賴于特別的數(shù)值

4.1.2.?在第一次完成后就一直有效,即使使用不同的參數(shù)重復(fù)執(zhí)行查詢也不會(huì)發(fā)生變化

4.1.3.?編譯時(shí)優(yōu)化

4.2.?動(dòng)態(tài)優(yōu)化

4.2.1.?和查詢的上下文有關(guān)

4.2.2.?在每次查詢的時(shí)候都重新評(píng)估

4.2.3.?運(yùn)行時(shí)優(yōu)化

5.?優(yōu)化類型

5.1.?重新定義聯(lián)接表的順序

5.1.1.?數(shù)據(jù)表的聯(lián)接并不總是按照在查詢中指定的順序進(jìn)行

5.2.?將外聯(lián)接轉(zhuǎn)化成內(nèi)聯(lián)接

5.2.1.?并不是所有的OUTER JOIN語(yǔ)句都必須以外聯(lián)接的方式執(zhí)行

5.3.?使用代數(shù)等價(jià)變換規(guī)則

5.4.?優(yōu)化COUNT()、MIN()和MAX()

5.4.1.?索引和列是否可為空通??梢詭椭鶰ySQL優(yōu)化這類表達(dá)式

5.5.?預(yù)估并轉(zhuǎn)化為常數(shù)表達(dá)式

5.5.1.?當(dāng)MySQL檢測(cè)到一個(gè)表達(dá)式可以轉(zhuǎn)化為常數(shù)的時(shí)候,就會(huì)一直把該表達(dá)式作為常數(shù)進(jìn)行優(yōu)化處理

5.6.?覆蓋索引掃描

5.6.1.?當(dāng)索引中的列包含所有查詢中需要使用的列的時(shí)候,MySQL就可以使用索引返回需要的數(shù)據(jù),而無(wú)須查詢對(duì)應(yīng)的數(shù)據(jù)行

5.7.?子查詢優(yōu)化

5.7.1.?將子查詢轉(zhuǎn)換為一種效率更高的形式,從而減少多個(gè)查詢多次對(duì)數(shù)據(jù)進(jìn)行訪問(wèn)

5.8.?提前終止查詢

5.8.1.?在發(fā)現(xiàn)已經(jīng)滿足查詢需求的時(shí)候,MySQL總是能夠立刻終止查詢

5.8.2.?一個(gè)典型的例子就是當(dāng)使用了LIMIT子句的時(shí)候

5.9.?類似這種“不同值/不存在”的優(yōu)化一般可用于DISTINCT、NOT EXIST()或者LEFT JOIN類型的查詢

5.10.?⑩等值傳播

5.11.?⑾列表IN()的比較

5.11.1.?IN()完全等同于多個(gè)OR條件的子句,因?yàn)檫@兩者是完全等價(jià)的

5.11.2.?在MySQL中這點(diǎn)是不成立的,MySQL將IN()列表中的數(shù)據(jù)先進(jìn)行排序,然后通過(guò)二分查找的方式來(lái)確定列表中的值是否滿足條件,這是一個(gè)O(logn)復(fù)雜度的操作,等價(jià)地轉(zhuǎn)換成OR查詢的復(fù)雜度為O(n),對(duì)于IN()列表中有大量取值的時(shí)候,MySQL的處理速度將會(huì)更快

6.?表和索引的統(tǒng)計(jì)信息

6.1.?存儲(chǔ)引擎則給優(yōu)化器提供對(duì)應(yīng)的統(tǒng)計(jì)信息,包括:每個(gè)表或者索引有多少個(gè)頁(yè)面、每個(gè)表的每個(gè)索引的基數(shù)是多少、數(shù)據(jù)行和索引的長(zhǎng)度是多少、索引的分布信息等

7.?聯(lián)接查詢

7.1.?MySQL對(duì)任何聯(lián)接都執(zhí)行嵌套循環(huán)聯(lián)接操作,即MySQL先在一個(gè)表中循環(huán)取出單條數(shù)據(jù),然后再嵌套循環(huán)到下一個(gè)表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止

7.2.?在MySQL 8.0.20版本之后,已經(jīng)不再使用基于塊的嵌套循環(huán)聯(lián)接操作,取而代之的是哈希聯(lián)接

7.2.1.?這讓聯(lián)接操作性能變得更好,特別是當(dāng)數(shù)據(jù)集可以全部存儲(chǔ)在內(nèi)存時(shí)

7.3.?通常多表聯(lián)接的時(shí)候,可以有多種不同的聯(lián)接順序來(lái)獲得相同的執(zhí)行結(jié)果

7.4.?執(zhí)行計(jì)劃

7.4.1.?如果你對(duì)某個(gè)查詢執(zhí)行EXPLAIN EXTENDED后,再執(zhí)行SHOWWARNINGS,就可以看到重構(gòu)出的查詢

7.5.?讓查詢進(jìn)行更少的回溯和重讀操作

7.5.1.?可以使用STRAIGHT_JOIN關(guān)鍵字重寫(xiě)查詢,讓優(yōu)化器按照你認(rèn)為的最優(yōu)的聯(lián)接順序執(zhí)行

7.6.?n個(gè)表的聯(lián)接可能有n的階乘種聯(lián)接順序

7.6.1.?優(yōu)化器選擇使用“貪婪”搜索的方式查找“最優(yōu)”的聯(lián)接順序

7.6.2.?當(dāng)需要聯(lián)接的表超過(guò)optimizer_search_depth的限制的時(shí)候,就會(huì)選擇“貪婪”搜索模式了

7.7.?查詢不能重新排序,聯(lián)接優(yōu)化器可以利用這一點(diǎn)通過(guò)消除選擇來(lái)減小搜索空間

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

本文來(lái)自互聯(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版)筆記06_優(yōu)化數(shù)據(jù)類型(上)

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

    3.2.2.1.?字符集和排序規(guī)則(collation)使字符型數(shù)據(jù)的比較更復(fù)雜 3.2.2.2.?應(yīng)該將日期和時(shí)間存儲(chǔ)為MySQL的內(nèi)置類型而不是字符串類型 3.2.2.3.?應(yīng)該用整型數(shù)據(jù)存儲(chǔ)IP地址 4.1.1.1.?使用8、16、24、32和64位存儲(chǔ)空間 5.2.4.1.?VARCHAR(1000)的列則需要1002個(gè)字節(jié),因?yàn)樾枰?字節(jié)存儲(chǔ)長(zhǎng)度

    2024年02月09日
    瀏覽(24)
  • 讀高性能MySQL(第4版)筆記07_優(yōu)化數(shù)據(jù)類型(下)

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

    2.3.1.1.?與UNIX時(shí)間戳相同 2.3.2.1.?會(huì)遇到2038年的問(wèn)題 2.3.2.1.1.?使用帶符號(hào)的32位INT,可以表達(dá)直到2038年的時(shí)間 2.3.2.1.2.?使用無(wú)符號(hào)的32位INT,可以表達(dá)直到2106年的時(shí)間 2.3.2.1.3.?使用64位,還可以超出這些范圍 2.3.3.1.?MySQL服務(wù)器、操作系統(tǒng)和客戶端連接都有時(shí)區(qū)設(shè)置 2.3.3.2.?存

    2024年02月09日
    瀏覽(22)
  • 讀高性能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)的專用線程)打開(kāi) 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)存中更改頁(yè)面,而不用將更改刷新到磁盤,這通常涉及隨機(jī)I/O,速度非常慢 4.9.2.2.?將更改的記錄寫(xiě)入順序日志文件,這樣要快得多 4.9.2.3.?后臺(tái)線程可以稍后將修改過(guò)的頁(yè)面刷新到磁盤,這樣做可以優(yōu)化寫(xiě)操作的性能 5.11.2.1.?只有進(jìn)行特殊的擦除操作之后,

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

    2024年02月12日
    瀏覽(24)
  • 《高性能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ù)量越來(lái)越大時(shí),索引對(duì)性能的影響愈發(fā)重要。 在數(shù)據(jù)量較小且負(fù)載較低時(shí),不恰當(dāng)?shù)乃饕龑?duì)性能的影響可能還不明顯,但當(dāng)數(shù)據(jù)量逐漸增大時(shí)

    2024年02月07日
    瀏覽(99)
  • 【QT性能優(yōu)化】QT性能優(yōu)化之QT6框架高性能模型視圖代理框架千萬(wàn)級(jí)數(shù)據(jù)表分頁(yè)查詢優(yōu)化

    【QT性能優(yōu)化】QT性能優(yōu)化之QT6框架高性能模型視圖代理框架千萬(wàn)級(jí)數(shù)據(jù)表分頁(yè)查詢優(yōu)化

    QT性能優(yōu)化之QT6框架高性能模型視圖代理框架千萬(wàn)級(jí)數(shù)據(jù)表分頁(yè)查詢優(yōu)化 簡(jiǎn)介 本文介紹了QT模型視圖代理框架中的QT表格控件和QT數(shù)據(jù)庫(kù)模塊中的QT數(shù)據(jù)庫(kù)查詢模型結(jié)合使用的一個(gè)應(yīng)用實(shí)踐案例:QT高性能表格控件分頁(yè)展示千萬(wàn)行數(shù)據(jù)。本文介紹了這個(gè)應(yīng)用實(shí)踐案例的運(yùn)行效果

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

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

    2024年02月11日
    瀏覽(50)
  • 讀高性能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.?通過(guò)比較節(jié)點(diǎn)頁(yè)的值和要查找的值可以找到合適的指針進(jìn)入下層子節(jié)點(diǎn),這些指針實(shí)際上定義了子節(jié)點(diǎn)頁(yè)中

    2024年02月08日
    瀏覽(98)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包