日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Mysql常見的慢查詢優化方式總結

瀏覽:183日期:2023-05-05 10:11:56
目錄
  • 前言
  • (1)數據庫中設置SQL慢查詢
  • (2)分析慢查詢日志
  • (3)常見的慢查詢優化
  • 總結

前言

這篇文章主要是就在公司實習的時候,對SQL優化工作作出的一些整理。

在公司實習的時候,導師分配了SQL慢查詢優化的任務,任務是這樣的:每周從平臺中導出生產數據庫的慢查詢文件進行分析。進行SQL優化的手段也主要是修改SQL寫法,或者新增索引。

現在從記錄項目中的一點點做起。

(1)數據庫中設置SQL慢查詢

一、第一步.開啟mysql慢查詢

方式一:

修改配置文件 在 my.ini 增加幾行: 主要是慢查詢的定義時間(超過2秒就是慢查詢),以及慢查詢log日志記錄( slow_query_log)

方法二:通過MySQL數據庫開啟慢查詢:

(2)分析慢查詢日志

直接分析mysql慢查詢日志 ,利用explain關鍵字可以模擬優化器執行SQL查詢語句,來分析sql慢查詢語句

例如:執行EXPLAIN SELECT * FROM res_user ORDER BYmodifiedtime LIMIT 0,1000

得到如下結果: 顯示結果分析:

table | type | possible_keys | key |key_len | ref | rows | Extra EXPLAIN列的解釋:

  • table 顯示這一行的數據是關于哪張表的
  • type 這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、indexhe和ALL
  • rows 顯示需要掃描行數
  • key 使用的索引

(3)常見的慢查詢優化

(1)索引沒起作用的情況

1. 使用LIKE關鍵字的查詢語句

在使用LIKE關鍵字進行查詢的查詢語句中,如果匹配字符串的第一個字符為“%”,索引不會起作用。只有“%”不在第一個位置索引才會起作用。

2. 使用多列索引的查詢語句

MySQL可以為多個字段創建索引。一個索引最多可以包括16個字段。對于多列索引,只有查詢條件使用了這些字段中的第一個字段時,索引才會被使用。

(2)優化數據庫結構

合理的數據庫結構不僅可以使數據庫占用更小的磁盤空間,而且能夠使查詢速度更快。數據庫結構的設計,需要考慮數據冗余、查詢和更新的速度、字段的數據類型是否合理等多方面的內容。

1. 將字段很多的表分解成多個表

對于字段比較多的表,如果有些字段的使用頻率很低,可以將這些字段分離出來形成新表。因為當一個表的數據量很大時,會由于使用頻率低的字段的存在而變慢。

2. 增加中間表

對于需要經常聯合查詢的表,可以建立中間表以提高查詢效率。通過建立中間表,把需要經常聯合查詢的數據插入到中間表中,然后將原來的聯合查詢改為對中間表的查詢,以此來提高查詢效率。

(3)分解關聯查詢

將一個大的查詢分解為多個小查詢是很有必要的。

很多高性能的應用都會對關聯查詢進行分解,就是可以對每一個表進行一次單表查詢,然后將查詢結果在應用程序中進行關聯,很多場景下這樣會更高效,例如:

 SELECT * FROM tag JOIN tag_post ON tag_id = tag.idJOIN post ON tag_post.post_id = post.idWHERE tag.tag = "mysql";分解為:SELECT * FROM tag WHERE tag = "mysql";SELECT * FROM tag_post WHERE tag_id = 1234;SELECT * FROM post WHERE post.id in (123,456,567);

(4)優化LIMIT分頁

在系統中需要分頁的操作通常會使用limit加上偏移量的方法實現,同時加上合適的order by 子句。如果有對應的索引,通常效率會不錯,否則MySQL需要做大量的文件排序操作。

一個非常令人頭疼問題就是當偏移量非常大的時候,例如可能是limit 10000,20這樣的查詢,這是mysql需要查詢10020條然后只返回最后20條,前面的10000條記錄都將被舍棄,這樣的代價很高。

優化此類查詢的一個最簡單的方法是盡可能的使用索引覆蓋掃描,而不是查詢所有的列。然后根據需要做一次關聯操作再返回所需的列。對于偏移量很大的時候這樣做的效率會得到很大提升。

對于下面的查詢:

select id,title from collect limit 90000,10;

該語句存在的最大問題在于limit M,N中偏移量M太大(我們暫不考慮篩選字段上要不要添加索引的影響),導致每次查詢都要先從整個表中找到滿足條件 的前M條記錄,之后舍棄這M條記錄并從第M+1條記錄開始再依次找到N條滿足條件的記錄。如果表非常大,且篩選字段沒有合適的索引,且M特別大那么這樣的代價是非常高的。 試想,如我們下一次的查詢能從前一次查詢結束后標記的位置開始查找,找到滿足條件的100條記錄,并記下下一次查詢應該開始的位置,以便于下一次查詢能直接從該位置 開始,這樣就不必每次查詢都先從整個表中先找到滿足條件的前M條記錄,舍棄,在從M+1開始再找到100條滿足條件的記錄了。

方法一:慮篩選字段(title)上加索引

title字段加索引 (此效率如何未加驗證)

方法二:先查詢出主鍵id值

select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;

原理:先查詢出90000條數據對應的主鍵id的值,然后直接通過該id的值直接查詢該id后面的數據。

方法三:“關延遲聯”

如果這個表非常大,那么這個查詢可以改寫成如下的方式:

Select news.id, news.description from news inner join (select id from news order by title limit 50000,5) as myNew using(id);

這里的“關延遲聯”將大大提升查詢的效率,它讓MySQL掃描盡可能少的頁面,獲取需要的記錄后再根據關聯列回原表查詢需要的所有列。這個技術也可以用在優化關聯查詢中的limit。

方法四:建立復合索引 acct_id和create_time

select * from acct_trans_log WHERE  acct_id = 3095  order by create_time desc limit 0,10

注意sql查詢慢的原因都是:引起filesort

(5)分析具體的SQL語句 1、兩個表選哪個為驅動表,表面是可以以數據量的大小作為依據,但是實際經驗最好交給mysql查詢優化器自己去判斷。 例如: select * from a where id in (select id from b );

對于這條sql語句它的執行計劃其實并不是先查詢出b表的所有id,然后再與a表的id進行比較。
mysql會把in子查詢轉換成exists相關子查詢,所以它實際等同于這條sql語句:select * from a where exists(select * from b where b.id=a.id );

而exists相關子查詢的執行原理是: 循環取出a表的每一條記錄與b表進行比較,比較的條件是a.id=b.id . 看a表的每條記錄的id是否在b表存在,如果存在就行返回a表的這條記錄。

exists查詢有什么弊端?

由exists執行原理可知,a表(外表)使用不了索引,必須全表掃描,因為是拿a表的數據到b表查。而且必須得使用a表的數據到b表中查(外表到里表中),順序是固定死的。

如何優化?

建索引。但是由上面分析可知,要建索引只能在b表的id字段建,不能在a表的id上,mysql利用不上。

這樣優化夠了嗎?還差一些。

由于exists查詢它的執行計劃只能拿著a表的數據到b表查(外表到里表中),雖然可以在b表的id字段建索引來提高查詢效率。
但是并不能反過來拿著b表的數據到a表查,exists子查詢的查詢順序是固定死的。

為什么要反過來?

因為首先可以肯定的是反過來的結果也是一樣的。這樣就又引出了一個更細致的疑問:在雙方兩個表的id字段上都建有索引時,到底是a表查b表的效率高,還是b表查a表的效率高?

該如何進一步優化?

把查詢修改成inner join連接查詢:select * from a inner join b on a.id=b.id; (但是僅此還不夠,接著往下看)

為什么不用left join 和 right join?

這時候表之間的連接的順序就被固定住了,比如左連接就是必須先查左表全表掃描,然后一條一條的到另外表去查詢,右連接同理。仍然不是最好的選擇。

為什么使用inner join就可以?

inner join中的兩張表,如: a inner join b,但實際執行的順序是跟寫法的順序沒有半毛錢關系的,最終執行也可能會是b連接a,順序不是固定死的。如果on條件字段有索引的情況下,同樣可以使用上索引。

那我們又怎么能知道a和b什么樣的執行順序效率更高?

你不知道,我也不知道。誰知道?mysql自己知道。讓mysql自己去判斷(查詢優化器)。具體表的連接順序和使用索引情況,mysql查詢優化器會對每種情況做出成本評估,最終選擇最優的那個做為執行計劃。

在inner join的連接中,mysql會自己評估使用a表查b表的效率高還是b表查a表高,如果兩個表都建有索引的情況下,mysql同樣會評估使用a表條件字段上的索引效率高還是b表的。

利用explain字段查看執行時運用到的key(索引)

而我們要做的就是:把兩個表的連接條件的兩個字段都各自建立上索引,然后explain 一下,查看執行計劃,看mysql到底利用了哪個索引,最后再把沒有使用索引的表的字段索引給去掉就行了。

總結

到此這篇關于Mysql常見的慢查詢優化方式的文章就介紹到這了,更多相關Mysql慢查詢優化內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MySQL
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜性色一区二区三区免费视频| 国产三级精品三级在线观看国产| 国产亚洲观看| 日韩高清一区二区| 免费观看在线综合| 日本亚洲欧美天堂免费| 亚洲日本在线观看视频| 日本麻豆一区二区三区视频| 日韩精品91亚洲二区在线观看| 视频一区日韩| 日韩1区2区日韩1区2区| 久久成人一区| 最新亚洲一区| 性色av一区二区怡红| 巨乳诱惑日韩免费av| 中文日韩在线| 亚洲一区二区日韩| 亚洲精品在线二区| 日韩中文字幕| 国产精品99久久久久久董美香| 免费一区二区三区在线视频| 精品视频在线一区二区在线| 午夜av不卡| 欧美日韩第一| 亚洲三级av| 国产精品66| 精品国产乱码| 欧美午夜精品一区二区三区电影| 99综合视频| 日本欧美在线| 91欧美国产| 蜜臀av免费一区二区三区| 日韩中文字幕区一区有砖一区| 日韩手机在线| 精品一区二区三区中文字幕在线| 色综合www| 99在线|亚洲一区二区| 日本欧美久久久久免费播放网| 精品国产不卡一区二区| 偷拍欧美精品| 欧美在线黄色| 成人黄色av| 亚洲一区二区三区高清| 欧美另类中文字幕| 久久国产欧美| 亚洲欧美网站在线观看| 麻豆久久一区二区| 悠悠资源网久久精品| 国产精品一区二区精品视频观看| 日韩三区免费| 人人精品久久| 一本大道色婷婷在线| 亚洲视频电影在线| 成人在线免费观看网站| 91九色精品| 国产亚洲一卡2卡3卡4卡新区| 精品国产亚洲一区二区三区在线| 日韩电影免费网站| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品视频3p| 免费欧美一区| 久久天堂影院| 蜜臀久久99精品久久久久久9| 久久三级中文| 日韩网站在线| 精品网站999| 亚洲男女自偷自拍| 国产一区二区三区91| 久久夜色精品| 伊人久久视频| 欧美日韩xxxx| 99免费精品| 国产精品mv在线观看| 亚洲综合三区| 欧美国产美女| 欧美日韩一区二区国产| 欧美精品一线| 久久影院午夜精品| 日韩国产欧美三级| 免费黄色成人| 国产不卡av一区二区| 日韩一区二区三区免费视频| 久久精品亚洲欧美日韩精品中文字幕| 日韩动漫一区| 亚洲精品在线观看91| 狠狠久久伊人中文字幕| 日韩一区二区久久| 国产成人免费| 久久精品99久久久| 国产精品一区二区中文字幕| 在线视频观看日韩| 福利一区和二区| 国产欧美大片| 日韩一区二区三免费高清在线观看 | 国产欧美一区| 久久久久久久久久久9不雅视频| 国产日韩一区二区三区在线| 99视频精品| 99国产精品免费视频观看| 国产在线不卡一区二区三区| 欧美中文高清| 中文字幕一区二区av| 波多野结衣一区| 97se综合| 国产精品二区不卡| 国产精品2区| 日韩va亚洲va欧美va久久| 香蕉久久久久久久av网站| 久久婷婷激情| 一区二区三区四区日本视频| 国产欧美亚洲精品a| 亚洲日本免费电影| 午夜在线一区二区| 五月天综合网站| 欧美午夜精彩| 国产麻豆久久| 日韩精品dvd| www.com.cn成人| 欧美少妇精品| 少妇精品导航| av亚洲一区二区三区| 日韩深夜视频| 亚洲天堂免费电影| 成人午夜精品| 在线中文字幕播放| 精品入口麻豆88视频| 免费在线成人| 久久在线91| 欧美xxxx性| 精品视频国内| 国产精品国产三级国产在线观看| 久久精品国产999大香线蕉| 麻豆91精品91久久久的内涵| 国产精品天堂蜜av在线播放| 欧美在线观看天堂一区二区三区| 亚洲3区在线| 亚洲2区在线| 日本午夜精品| 国产精品亚洲二区| 精品美女在线视频| 激情综合婷婷| 国产精品伦理久久久久久| 另类专区亚洲| 久久要要av| 免费日韩一区二区| 日韩av一区二| 成人在线丰满少妇av| 日韩一区二区中文| 激情综合网站| 在线看片日韩| 国产日韩三级| 成人台湾亚洲精品一区二区| 电影91久久久| 日韩不卡在线| 国产精品毛片在线| 亚洲va久久| 91成人在线| 福利片在线一区二区| 999国产精品999久久久久久| 亚洲精品成人| 青青青国产精品| 麻豆国产欧美一区二区三区| 久久精品日韩欧美| 日韩精品专区| 91久久在线| 911亚洲精品| 水蜜桃久久夜色精品一区| 1024精品一区二区三区| 伊人精品久久| 欧美国产极品| 欧美亚洲国产精品久久| 国产精品美女久久久浪潮软件| 日本不卡不码高清免费观看| 久久亚洲精精品中文字幕| 一本大道色婷婷在线| 日本 国产 欧美色综合| 国产精品蜜月aⅴ在线| 91亚洲国产| 丝袜国产日韩另类美女| 久久激情五月激情| 欧美日韩精品免费观看视欧美高清免费大片| 久久影院一区| 欧美精品影院| 亚洲va在线| 欧美一级全黄| 99久久婷婷| 日韩专区视频网站| а√天堂8资源在线| 亚洲伊人影院| 激情视频网站在线播放色| 老牛影视一区二区三区| 综合激情一区| 欧美精品一区二区三区精品| 亚洲免费福利| 国产一区二区三区四区二区| 免费福利视频一区二区三区| 蜜臀av在线播放一区二区三区| 黑丝一区二区三区| 老鸭窝毛片一区二区三区| 99在线精品免费视频九九视 |