最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中慢SQL優(yōu)化的不同方式介紹

 更新時間:2025年03月26日 15:24:30   作者:晚安日記wanna  
慢 SQL 的優(yōu)化,主要從兩個方面考慮,SQL 語句本身的優(yōu)化,以及數(shù)據(jù)庫設計的優(yōu)化,下面小編就來給大家介紹一下有哪些方式可以優(yōu)化慢 SQL吧

慢 SQL 的優(yōu)化,主要從兩個方面考慮,SQL 語句本身的優(yōu)化,以及數(shù)據(jù)庫設計的優(yōu)化。

避免不必要的列

SQL 查詢的時候,應該只查詢需要的列,而不是包含額外的列,像select *這種寫法應該盡量避免。

分頁優(yōu)化

在數(shù)據(jù)量比較大,分頁比較深的情況下,需要考慮分頁的優(yōu)化。

 select * from tabel where type = 2 and level = 9 order by id asc limit 100000,10;

延遲關聯(lián)

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

 select a.* from table a,
 (select id from table where type = 2 and level = 9 order by id asc limit 100000,10) b
 where a.id = b.id;

id 偏移量

偏移量就是找到 limit 第一個參數(shù)對應的主鍵值,根據(jù)這個主鍵值再去過濾并 limit

 select * from table where id >
 (select id from table where type = 2 and level = 9 order by id asc limit 190 );

索引優(yōu)化

合理的設計和使用索引,是優(yōu)化慢 SQL 的利器。

1.利用覆蓋索引

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

 select b from test where a = "wanna";
 alter table test add index idx_a_b (a,b);

2.避免使用 or 查詢

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

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

SQL 中,不等于操作符會導致查詢引擎放棄查詢索引,引起全表掃描,即時比較的字段上有索引

解決方法:通過把不等于操作符改成 or,可以使用索引,避免全表掃描

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

4.適當使用前綴索引

適當?shù)氖褂们熬Y索引,可以降低索引的控件占用,提高索引的查詢效率。

比如,郵箱的后綴都是固定的@xxx.com,那么類似這種后面幾位為固定值的字段就非常適合定義為前綴索引

 alter table test add index dix_emaile_prefix (email(6));

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

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

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

 select * from test where id + 1 = 50;
 select * from test where month(updateTime) = 7;

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

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

JOIN 的優(yōu)化

優(yōu)化子查詢

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

小表驅動大表

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

select name from 小表 left join 大表;

適當增加冗余字段

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

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

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

排序優(yōu)化

利用索引掃描做排序

MySQL 有兩種方式生成有序結果:一是對結果集進行排序的操作,而是按照索引順序掃描得出的結果,索引是排好序的數(shù)據(jù)結果,自然是有序的。

但是如果索引不能覆蓋查詢所需列(覆蓋索引),就會沒掃描一條記錄回表查詢一次(逐個獲取),這個讀操作是隨機 IO,通常會比順序全表掃描還慢,有時會直接放棄使用索引轉為全表掃描。

因此,在設計索引時,盡可能使用同一個索引既滿足排序又用于查找行。

-- 索引(a,b,c)
select b,c from test where a like 'aa%' order by b,c;

只有當索引的列順序和order by子句的順序完全一致,并且所有列的排序方向都一樣時,才能夠使用索引來對結果做排序。

UNION 優(yōu)化

條件下推

MySQL 處理 union 的策略是先創(chuàng)建臨時表,然后將各個查詢結果填充到臨時表中最后再來做查詢,很多優(yōu)化策略在 union 查詢中都會失效,因為它無法利用索引。

所以需要將where、limit等子句下推到 union 的各個子查詢中,以便優(yōu)化器可以充分利用這些條件進行優(yōu)化。

此外,除非確實需要服務器去推,一定要試用union all,如果不加all關鍵字,MySQL 會給臨時表加上 distinct選項,這會導致對整個臨時表做唯一性檢查,代價很高。

到此這篇關于MySQL中慢SQL優(yōu)化的不同方式介紹的文章就介紹到這了,更多相關MySQL慢SQL優(yōu)化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL慢查詢日志超詳細總結

    MySQL慢查詢日志超詳細總結

    mysql的慢查詢日志是mysql提供的一種日志記錄,它用來記錄在mysql中響應時間超過閾值的語句,下面這篇文章主要給大家介紹了關于MySQL慢查詢日志的相關資料,需要的朋友可以參考下
    2023-05-05
  • MySQL 正則表達式用法、模式和注意事項詳解

    MySQL 正則表達式用法、模式和注意事項詳解

    MySQL正則表達式通過REGEXP/RLIKE操作符實現(xiàn)模式匹配,支持元字符、字符類、量詞等基本功能,8.0+版本新增REGEXP_LIKE等函數(shù),提供更強大的文本處理能力,使用時需注意大小寫、性能及版本兼容性,本文介紹MySQL 正則表達式詳細說明,感興趣的朋友一起看看吧
    2025-08-08
  • MySQL8.0+版本1045錯誤的問題及解決辦法

    MySQL8.0+版本1045錯誤的問題及解決辦法

    這篇文章主要介紹了MySQL8.0+版本1045錯誤解決辦法,使用命令行登錄MySQL報錯1045 Access denied for user ‘root’@‘localhost’ (using password:YES),折騰半天才解決問題,需要的朋友可以參考下
    2022-08-08
  • MySql利用父id遞歸向下查詢子節(jié)點的方法實例

    MySql利用父id遞歸向下查詢子節(jié)點的方法實例

    項目中遇到一個需求,要求查處菜單節(jié)點的所有節(jié)點,在網(wǎng)上查了一下,大多數(shù)的方法用到了存儲過程,由于線上環(huán)境不能隨便添加存儲過程,所以自己寫一個,這篇文章主要給大家介紹了關于MySql利用父id遞歸向下查詢子節(jié)點的相關資料,需要的朋友可以參考下
    2022-03-03
  • MySQL 快速刪除大量數(shù)據(jù)(千萬級別)的幾種實踐方案詳解

    MySQL 快速刪除大量數(shù)據(jù)(千萬級別)的幾種實踐方案詳解

    這篇文章主要介紹了MySQL 快速刪除大量數(shù)據(jù)(千萬級別)的幾種實踐方案詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • navicat中創(chuàng)建存儲過程、觸發(fā)器和使用游標的簡單實例(圖文)

    navicat中創(chuàng)建存儲過程、觸發(fā)器和使用游標的簡單實例(圖文)

    這篇文章主要介紹了navicat中創(chuàng)建存儲過程、觸發(fā)器和使用游標的簡單實例,需要的朋友可以參考下
    2017-02-02
  • MySQL數(shù)據(jù)庫實驗實現(xiàn)簡單數(shù)據(jù)庫應用系統(tǒng)設計

    MySQL數(shù)據(jù)庫實驗實現(xiàn)簡單數(shù)據(jù)庫應用系統(tǒng)設計

    這篇文章主要介紹了MySQL數(shù)據(jù)庫實驗實現(xiàn)簡單數(shù)據(jù)庫應用系統(tǒng)設計,文章通過理解并能運用數(shù)據(jù)庫設計的常見步驟來設計滿足給定需求的概念模和關系數(shù)據(jù)模型展開詳情,需要的朋友可以參考一下
    2022-06-06
  • MySQL常用表級操作總結

    MySQL常用表級操作總結

    這篇文章主要為大家詳細介紹了MySQL中常用的表級操作,文中的示例代碼簡潔易懂,對我們學習MySQL有一定的幫助,感興趣的小伙伴可以學習一下
    2023-08-08
  • Linux下二進制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟

    Linux下二進制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟

    這篇文章主要介紹了Linux下二進制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Mysql配置主從復制-GTID模式詳解

    Mysql配置主從復制-GTID模式詳解

    這篇文章主要介紹了Mysql配置主從復制-GTID模式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論

邮箱| 西华县| 乌鲁木齐市| 教育| 岳阳市| 讷河市| 南昌县| 翁源县| 贡觉县| 区。| 潮安县| 无棣县| 石台县| 淄博市| 翁牛特旗| 介休市| 伊宁市| 长治县| 哈巴河县| 高碑店市| 修武县| 长治县| 当阳市| 讷河市| 博罗县| 司法| 大厂| 连城县| 新化县| 班玛县| 新邵县| 兴城市| 溧阳市| 瑞昌市| 尉犁县| 古浪县| 玉溪市| 常宁市| 宁津县| 清流县| 和硕县|