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

MySQL慢SQL優(yōu)化方案匯總

這篇具有很好參考價值的文章主要介紹了MySQL慢SQL優(yōu)化方案匯總。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?MySQL慢SQL優(yōu)化方案匯總,mysql經(jīng)驗總結(jié),mysql,sql,數(shù)據(jù)庫

??個人主頁:? ? ?蒾酒

??系列專欄《mysql經(jīng)驗總結(jié)》

??山高路遠,行路漫漫,終有歸途


目錄

寫在前面

優(yōu)化思路

避免查詢不必要的列

分頁優(yōu)化

索引優(yōu)化

JOIN優(yōu)化

排序優(yōu)化

UNION 優(yōu)化

寫在最后


寫在前面

本文介紹了MySQL常見的優(yōu)化慢sql的手段,堅持看完相信對你有幫助。

同時歡迎訂閱MySQL系列專欄,持續(xù)分享MySQL的使用經(jīng)驗。

優(yōu)化思路

慢sql的優(yōu)化無非是從兩個方向著手

  • SQL語句本身的優(yōu)化
  • 據(jù)庫設(shè)計的優(yōu)化

下面進行漸進式的分享一些常見優(yōu)化手段

避免查詢不必要的列

查詢應(yīng)該精準(zhǔn)的查出需要的列,對于select * 的寫法要避免,因為所有字段查出來不僅sql查詢執(zhí)行慢,若是直接返回給前端,大量的數(shù)據(jù)也會影響網(wǎng)絡(luò)傳輸效率。

分頁優(yōu)化

對于數(shù)據(jù)量特別大,這時分頁會比較深,查詢掃描的數(shù)據(jù)量會比較大效率自然低,我們就需要進行分頁優(yōu)化

假設(shè)我們有一個包含大量訂單記錄的訂單表,其中每個訂單都有一個唯一的不包含業(yè)務(wù)邏輯的主鍵,并且我們想要查詢最近一個月的訂單并按照訂單id從小到大進行分頁顯示某頁。

假設(shè)出現(xiàn)深分頁的sql如下:

select * from orders where order_date >= date_sub(now(), interval 1 month)
 order by id limit 100000, 10;

執(zhí)行此SQL時需要先掃描到100000行,然后再去取10行,但是隨著掃描的記錄數(shù)越多,SQL的性能就會越差,因為掃描的記錄越多,MySQL需要掃描越多的數(shù)據(jù)來定位到具體的多少行,這樣耗費大量的 IO 成本和時間成本。

對于解決該深分頁問題通常有兩種方法

1.延遲關(guān)聯(lián)

先通過 where 條件提取出主鍵,在將該表與原數(shù)據(jù)表關(guān)聯(lián),通過主鍵 id 提取數(shù)據(jù)行,而不是通過原來的二級索引提取數(shù)據(jù)行

優(yōu)化后sql:

select o.*
from (
    select id
    from orders
    where order_date >= date_sub(now(), interval 1 month)
    order by id
    limit 100000, 10
) as sub
join orders as o on sub.id = o.id;

優(yōu)化后SQL中的子查詢只取主鍵id,可避免通過二級索引中的主鍵去回表查詢,這樣性能會快一些。

2.id偏移量

偏移量就是找到 limit 第一個參數(shù)對應(yīng)的主鍵值,根據(jù)這個主鍵值再去過濾并 limit,這種方法又稱為基于游標(biāo)的分頁。基于游標(biāo)的分頁的前提是需要保證主鍵或排序列的連續(xù)性、唯一性。

優(yōu)化后sql:

select *
from orders
where id >= (select id from orders order by id limit 100000, 1)
order by id
limit 10;

這種方法相對于原來直接使用偏移量和限制結(jié)果數(shù)量的方式,可以在大數(shù)據(jù)集上提供更穩(wěn)定和一致的性能,因為它不需要掃描和跳過大量的行。

索引優(yōu)化

通過合理的設(shè)計和使用索引,能夠有效優(yōu)化sql性能,這也是我們使用最多的手段。

下面介紹一下如何進行索引優(yōu)化:

使用覆蓋索引

InnoDB使用二級索引查詢數(shù)據(jù)時會回表,但是如果索引的葉節(jié)點中已經(jīng)包含要查詢的字段,那它沒有必要再回表查詢了,這就叫覆蓋索引,還有一個簡單的理解查詢列都是索引列。

示例:

select product_name, price
from products
where category_id = 1;
create index idx_category_id on products (category_id, product_name, price);

避免使用or查詢

在 MySQL 5.0 之前的版本要盡量避免使用 or 查詢,可以使用 union 或者子查詢來替代,因為早期的MySQL版本使用 or 查詢可能會導(dǎo)致索引失效,高版本引入了索引合并,解決了這個問題,不過建議大家在實際使用中還是規(guī)范寫法,能不用就少用。

避免使用 != 或者 <>操作符

SQL中,不等于操作符會導(dǎo)致查詢引擎放棄查詢索引,引起全表掃描,即使比較的字段上有索引。解決方法:通過把不等于操作符改成 or,可以使用索引,避免全表掃描

id <>'aaa'
id >'aaa'or id<'aaa

適當(dāng)使用前綴索引

適當(dāng)?shù)厥褂们熬Y索引,可以降低索引的空間占用,提高索引的查詢效率。比如,郵箱的后綴都是固定的“@xxx.com”,那么類似這種后面幾位為固定值的字段就非常適合定義為前綴索引

create index idx_email_prefix on users (email(6)); -- 假設(shè)后綴長度為6

需要注意的是,前綴索引也存在缺點,MySQL無法利用前綴索引做 order by和 group by 操作,也無法作為覆蓋索引。

避免列上函數(shù)運算

要避免在列字段上進行算術(shù)運算或其他表達式運算,否則可能會導(dǎo)致存儲引擎無法正確使用索引,從而影響了查詢的效率。

select order_id
from orders
where total_amount / 2 > 100

正確使用聯(lián)合索引

使用聯(lián)合索引的時候,注意最左匹配原則。?

JOIN優(yōu)化

優(yōu)化子查詢

盡量使用 Join 語句來替代子?xùn)嗽?,因為子?xùn)嗽兪乔短撞樵?,而嵌套查詢會新?chuàng)建一張臨時表,而臨時表的創(chuàng)建與銷毀會占用一定的系統(tǒng)資源以及花費一定的時間,同時對于返回結(jié)果集比較大的子查詢,其對查詢性能的影響更大?

小表驅(qū)動大表

關(guān)聯(lián)查詢的時候要拿小表去驅(qū)動大表,因為關(guān)聯(lián)的時候,MySQL內(nèi)部會遍歷驅(qū)動表,再去連接被驅(qū)動表

select name from小表 left join 大表;

適當(dāng)增加冗余字段

增加冗余字段可以減少大量的連表查詢,因為多張表的連表查詢性能很低,所有可以適當(dāng)?shù)脑黾尤哂嘧侄?,以減少多張表的關(guān)聯(lián)查詢,這是以空間換時間的優(yōu)化策略。

避免使用 JOIN 關(guān)聯(lián)太多的表

《阿里巴巴 Java 開發(fā)手冊》規(guī)定不要 join 超過三張表,第一join 太多降低査詢的速度,第二 join 的buffer 會占用更多的內(nèi)存。

排序優(yōu)化

利用索引掃描做排序

MYSQL有兩種方式生成有序結(jié)果:一是對結(jié)果集進行排序的操作,二是按照索引順序掃描得出的結(jié)果,索引是排好序的數(shù)據(jù)結(jié)構(gòu),自然是有序的。
但是如果索引不能覆蓋查詢所需列(覆蓋索引),就會每掃描一條記錄回表查詢一次(逐個獲取),這個讀操作是隨機 IO,通常會比順序全表掃描還慢,有時會直接放棄使用索引轉(zhuǎn)為全表掃描。因此,在設(shè)計索引時,盡可能使用同一個索引既滿足排序又用于查找行。

#索引為 a,b,c
select b,c from test where a like 'aa%' order by b,c;

只有當(dāng)索引的列順序和 ORDER BY 子句的順序完全一致,并且所有列的排序方向都一樣時,才能夠使用索引來對結(jié)果做排序。

UNION 優(yōu)化

條件下推

MySQL處理 union 的策略是先創(chuàng)建臨時表,然后將各個查詢結(jié)果填充到臨時表中最后再來做查詢,很多優(yōu)化策略在 union 查詢中都會失效,因為它無法利用索引。所以需要將 where、limit 等子句下推到 union 的各個子查詢中,以便優(yōu)化器可以充分利用這些條件進行優(yōu)化。

此外,除非確實需要服務(wù)器去重,一定要使用 union all,如果不加 all 關(guān)鍵字,MySQL 會給臨時表加上distinct 選項,這會導(dǎo)致對整個臨時表做唯一性檢查,代價很高。

寫在最后

MySQL優(yōu)化慢SQL的6種方式到這里就結(jié)束了,本文介紹了常見慢sql優(yōu)化的有效方式。任何問題評論區(qū)或私信討論,歡迎指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-854857.html

到了這里,關(guān)于MySQL慢SQL優(yōu)化方案匯總的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Mysql數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化匯總

    ? ? ?設(shè)計表以最大限度地減少其在磁盤上的空間。這可以減少寫入磁盤和從磁盤讀取的數(shù)據(jù)量,從而帶來巨大的改進。較小的表通常需要較少的主內(nèi)存,而它們的內(nèi)容在查詢執(zhí)行過程中被主動處理。表數(shù)據(jù)的任何空間減少也會導(dǎo)致更小的索引可以更快地處理。 盡可能使用最

    2024年02月07日
    瀏覽(23)
  • [MySQL]SQL優(yōu)化之sql語句優(yōu)化

    [MySQL]SQL優(yōu)化之sql語句優(yōu)化

    ??鍵盤敲爛,年薪30萬?? 目錄 一、索引優(yōu)化 回顧: ??索引分類: ??索引失效: ??設(shè)計原則: ??SQL性能分析 二、SQL優(yōu)化 語句優(yōu)化 ?? insert語句: ?? 主鍵優(yōu)化: ?? order by優(yōu)化: ?? group by優(yōu)化: ?? limit 優(yōu)化 ?? count 優(yōu)化 ?? update 優(yōu)化? ??索引分類: 一般分類:主

    2024年02月04日
    瀏覽(24)
  • MySQL查詢優(yōu)化方案匯總(索引相關(guān))

    類型隱式轉(zhuǎn)換 大坑 大數(shù)據(jù)深度分頁,用主鍵 避免使用MySQL函數(shù) 避免類型的隱式轉(zhuǎn)換 避免使用函數(shù)或表達式,盡量只讓數(shù)據(jù)庫做純粹的增刪改查。 避免使用不等值做排除法 避免使用null值 減少大字段查詢,避免使用*,不說磁盤io的損耗,連網(wǎng)絡(luò)帶寬都跟著損耗。 如果只sel

    2024年03月09日
    瀏覽(21)
  • 【MySQL】sql如何優(yōu)化?

    (1)通過SQL監(jiān)控、請求、日志等找出耗時的SQL語句; (2)使用Explain方式查看SQL耗時的具體原因; (3)根據(jù)實際情況解決:索引、緩存、左右連接 select_type:簡單查詢or復(fù)雜查詢?simple、primary、subquery、deriveer、union。 type:SQL關(guān)聯(lián)類型, system const eq_ref ref range index All 。一般

    2024年02月07日
    瀏覽(95)
  • MySQL篇之SQL優(yōu)化

    MySQL篇之SQL優(yōu)化

    表的設(shè)計優(yōu)化(參考阿里開發(fā)手冊《嵩山版》) : ????????1. 比如設(shè)置合適的數(shù)值(tinyint ? int ? bigint),要根據(jù)實際情況選擇。 ????????2. 比如設(shè)置合適的字符串類型(char和varchar)char定長效率高,varchar可變長度,效率稍低。 ????????1. SELECT語句務(wù)必指明字段

    2024年02月19日
    瀏覽(25)
  • 【MySQL】SQL優(yōu)化(九)

    【MySQL】SQL優(yōu)化(九)

    ??MySQL學(xué)習(xí)·第九站~ ??本文已收錄至專欄:MySQL通關(guān)路 ??文末附全文思維導(dǎo)圖,感謝各位點贊收藏支持~ ?學(xué)習(xí)匯總貼,超詳細思維導(dǎo)圖:【MySQL】學(xué)習(xí)匯總(完整思維導(dǎo)圖) 如果我們需要一次性往數(shù)據(jù)庫表中插入多條記錄: 我們可以從以下三個方面進行優(yōu)化~ (1.1) 批量插入數(shù)

    2024年02月15日
    瀏覽(13)
  • [MySQL--SQL優(yōu)化]

    如果一次性需要 插入大批量數(shù)據(jù) ,使用 insert語句插入性能較低 ,此時 可以使用MySQL數(shù)據(jù)庫提供的load指令 進行插入。 操作如下: 針對于大數(shù)據(jù)量的情況下 分頁查詢時越往后就會變得越耗時。所以我們需要通過優(yōu)化limit來提升效率 優(yōu)化思路:自己計數(shù)。 比如:我們可以自己

    2024年02月07日
    瀏覽(21)
  • 【MySQL】SQL優(yōu)化

    【MySQL】SQL優(yōu)化

    記錄Mysql學(xué)習(xí)筆記,大部分圖片來自黑馬程序員MySQL教程。 插入多條數(shù)據(jù)的時候,可以按以下方式優(yōu)化。 批量插入時,一次性插入的數(shù)據(jù)建議不超過1000條。 MySQL默認自動提交事務(wù),所以插入操作會頻繁地開啟和提交事務(wù),建議手動提交。 主鍵順序插入性能高于亂序插入。

    2024年02月03日
    瀏覽(12)
  • MySQL查詢性能優(yōu)化——SQL優(yōu)化(四)

    MySQL查詢性能優(yōu)化——SQL優(yōu)化(四)

    ? 目錄 1、批量插入數(shù)據(jù) 1.1 linux環(huán)境下 1.1.1 開啟文件讀取 1.1.2 load數(shù)據(jù) 1.2 windows環(huán)境下 2、order by優(yōu)化 2.1 最左前綴 3、group by 3.1 最左前綴 4、count優(yōu)化 5、or條件優(yōu)化 ? 在上一期說到索引的使用,這期來聊一下SQL優(yōu)化,也是平常寫SQL的時候常用到的。 在前幾期也有聊到過批量插

    2024年02月19日
    瀏覽(84)
  • 【MySQL數(shù)據(jù)庫】MySQL 高級SQL 語句一

    【MySQL數(shù)據(jù)庫】MySQL 高級SQL 語句一

    ) % :百分號表示零個、一個或多個字符 _ :下劃線表示單個字符 ‘A_Z’:所有以 ‘A’ 起頭,另一個任何值的字符,且以 ‘Z’ 為結(jié)尾的字符串。例如,‘ABZ’ 和 ‘A2Z’ 都符合這一個模式,而 ‘AKKZ’ 并不符合 (因為在 A 和 Z 之間有兩個字符,而不是一個字符)。 ‘ABC%’

    2024年02月09日
    瀏覽(1352)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包