sql查詢索引語句_sql優化總結--基于sql語句優化和索引優化

概述

最近做查詢,統計和匯總。由于數據量比較龐大,大部分表數據上百萬,甚至有的表數據上千萬。所以在系統中做sql優化比較多,特此寫一篇文章總結一下關于sql優化方面的經驗。

導致查詢緩慢的原因

1、數據量過大

2、表設計不合理

3、sql語句寫得不好

4、沒有合理使用索引

下面主要針對sql語句的優化和索引優化做個總結。

3303be79b3c8b2feecb3a09acea7317c.png

針對SQL語句的優化

1、查詢語句中不要使用 *

2、盡量減少子查詢,使用關聯查詢(left join,right join,inner join)替代

3、減少使用IN或者NOT IN ,使用exists,not exists或者關聯查詢語句替代

4、or 的查詢盡量用 union或者union all 代替

(在確認沒有重復數據或者不用剔除重復數據時,union all會更好)

5、合理的增加冗余的字段(減少表的聯接查詢)

6、增加中間表進行優化(這個主要是在統計報表的場景,

后臺開定時任務將數據先統計好,盡量不要在查詢的時候去統計)

7、建表的時候能使用數字類型的字段就使用數字類型(type,status...),數字類型的字段作為條件查詢比字符串的快

8、那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的最末尾


索引優化

如果針對sql語句已經沒啥可以優化的,那我們就要考慮加索引了。

--說索引前需要explain查看sql的執行計劃

1 id

SELECT識別符。這是select查詢序列號。這個不重要

2 select_type

表示查詢中每個select子句的類型(簡單OR復雜)

有以下幾種值:

1 simple

查詢中不包含查詢或者UNION(聯合查詢)

2 PRIMARY

查詢中若包含任何復雜的子部分,最外層查詢則被標記為:PRIMARY

3 UNION

表示連接查詢的第2個或后面的查詢語句。

4 DEPENDENT UNION

UNION 中的第二個或者后面的select語句,取決于外面的查詢

5 UNION RESULT

連接查詢的結果

6 SUBQUERY

子查詢中的第一個select語句

7 DEPENDENT SUBQUERY

子查詢中的第一個select語句,取決于外面的查詢

8 DERIVED

select(from子句的子查詢)

3 table 表示查詢的表

4 type

表示表的連接類型

以下的連接類型的順序是從最佳類型到最差類型

1 syste

表僅有一行,這是const類型的特例,平時不會出現

2 const

數據表最多只有一個匹配行,因為只匹配一行數據,所以很快,常用于PRIMARY KEY

或者UNIQUE查詢,可理解為是最優化的。

3 eq_ref

mysql手冊是這樣說的: 對于每個來自前面的表的行組合,從該表中讀取一行。

這可能是最好的聯接類型,除了const類型。他用在一個索引的所有部分被聯接使用并且并且索引是UNIQUE或PRIMARY KEY eq_ref可以用于使用=比較帶索引的列。

4 ref

查詢條件索引既不是UNIQUE 也不是PRIMARY KEY 的情況,ref可用于=或操作符的帶索引的列。

5 ref_or_null

該聯接類型如同ref,但是添加了Mysql可以專門搜索包含null值的行,在解決子查詢中經常使用該聯接類型的優化。

以上這五種情況都是很理想的索引使用情況。

6 index

該連接類型與ALL相同,除了只有索引樹被掃描。這通常比ALL快,因為索引文件通常比數據文件小。

7 ALL

對于每個來自先前的表的行組合,進行完整的表掃描。

5 possible_key

指出Mysql能使用哪個索引在該表中找到行。

如果該列為NULL 說明沒有使用索引,可以對該列創建索引來提高性能

6 Key

顯示mysql實際決定使用的索引,如果沒有選擇索引,鍵是null

可以強制使用索引或者忽略索引:

強制使用索引:USE index(列名)

忽略使用索引:IGNORE INDEX(列名)

7 key_len

顯示mysql決定使用的鍵長度。如果鍵是NULL則長度為NULL。

注意:key_len 是確定了mysql將實際使用的索引長度

8 ref

顯示使用哪個列或常數與key一起從表中選擇行

9 rows

顯示mysql認為它執行查詢時必須檢查的行數

10 extra

關于MYSQL如何解析查詢的額外信息。Using temporary和Using filesort,意思MYSQL根本不能使用索引,結果是檢索會很慢

說明:extra列返回的描述的意義

Distinct :一旦mysql找到了與行相聯合匹配的行,就不再搜索了。

Not exists :mysql優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行,就不再搜索了。

Range checked for each Record(index map:#) :沒有找到理想的索引,因此對從前面表中來的每一個行組合,mysql檢查使用哪個索引,并用它來從表中返回行。這是使用索引的最慢的連接之一。

Using filesort :看到這個的時候,查詢就需要優化了。mysql需要進行額外的步驟來發現如何對返回的行排序。它根據連接類型以及存儲排序鍵值和匹配條件的全部行的行指針來排序全部行。

Using index :列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對表的全部的請求列都是同一個索引的部分的時候。

Using temporary :看到這個的時候,查詢需要優化了。這里,mysql需要創建一個臨時表來存儲結果,這通常發生在對不同的列集進行ORDER BY上,而不是GROUP BY上。

Where used :使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。如果不想返回表中的全部行,并且連接類型ALL或index,這就會發生,或者是查詢有問題。

使用explain查看sql執行計劃后,我們主要先看下type屬性,表示連接的類型,如果是ALL這種那就需要優化了,

再看下possible_key屬性,表示可以使用的索引,如果沒有則為null,key屬性表示mysql實際決定使用的索引,如果沒有選擇索引,鍵是null,

rows 表示mysql認為它執行查詢時必須檢查的行數,行數越多效率越低。


篇幅有限,關于sql方面的優化就介紹到這了,后面會分享更多關于優化方面的內容,感興趣的朋友可以關注下!!

5ff4f893c4682d5c7e0c8091ca41159e.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281962.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電商行業運維實踐

電商行業運維實踐--------------------…

數據結構小總結(成都磨子橋技工學校數據結構前12題)

[pixiv] https://www.pixiv.net/member_illust.php?modemedium&illust_id34352147 暑假的作業,頹頹的我總算是寫完了 線段樹 線段樹是一個高級玩意,不僅可以求區間和,區間最大等等的簡單問題,靈活運用還有好多變種。自從學…

【九章算法免費講座第一期】轉專業找CS工作的“打狗棒法”

講座時間: 美西時間6月5日18:30-20:00(周五) 北京時間6月6日09:30-11:00(周六a.m) 講座安排: 免費在線直播講座 報名網址: http://t.cn/R2XgMSH&a…

golang mysql 防注入_Go,Gorm 和 Mysql 是如何防止 SQL 注入的

Go,Gorm 和 Mysql 是如何防止 SQL 注入的SQL 注入和 SQL 預編譯技術什么是 SQL 注入所謂SQL注入(sql inject),就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說&#xff…

wav2midi 音樂旋律提取算法 附可執行demo

前面提及過,音頻指紋算法的思路。 也梳理開源了兩個比較經典的算法。 https://github.com/cpuimage/shazam https://github.com/cpuimage/AudioFingerprinter 后來一段時間,稍微看了下這兩個算法,還有不少可以精簡優化的空間。 例如抗噪&…

全新升級的AOP框架Dora.Interception[5]: 實現任意的攔截器注冊方式

Dora.Interception提供了兩種攔截器注冊方式,一種是利用標注在目標類型、屬性和方法上的InterceptorAttribute特性,另一種采用基于目標方法或者屬性的調用表達式。通過提供的擴展點,我們可以任何我們希望的攔截器注冊方式。目錄一、IIntercep…

SCAU 算法課的題

8594 有重復元素的排列問題(優先做) 時間限制:1000MS 內存限制:1000K提交次數:1610 通過次數:656 題型: 編程題 語言: G;GCC;VC Description 設集合R{r1,r2,...,rn}是要進行排列的n個元素,其中r1,r2,...,rn可能相同。 試著設計一個算法&am…

react 數組新增_React 新特性 Hooks 講解及實例(二)

本文是 React 新特性系列的第二篇,第一篇請點擊這里:React 新特性講解及實例什么是 HooksHook 是 React 16.8 的新增特性。它可以讓你在不編寫 類組件 的情況下使用 state以及其他的 React 特性。類組件的不足狀態邏輯復用難缺少復用機制渲染屬性和高階組…

智課雅思詞匯---二十二、-al即是名詞性后綴又是形容詞后綴

智課雅思詞匯---二十二、-al即是名詞性后綴又是形容詞后綴 一、總結 一句話總結: 后綴:-al ②[名詞后綴] 1、構成抽象名詞,表示行為、狀況、事情 refusal 拒絕 proposal 提議 withdrawal 撤退 1、名詞性后綴acy是什么意思? 后綴&a…

javascript事件處理程序

javascript 事件處理程序 1、普通事件處理程序 <input type"button" value"click me" οnclick"showMessage()" /> function showMessage(){alert("clicked");} 2、DOMO 級事件處理程序 <span style"white-space:pre&…

eclipse新發現功能之dos和terminal(ssh連接)

dos功能&#xff1a; window——》show view——》other——》remote systems&#xff0c;選擇remote shell&#xff0c;選擇確定或者雙擊&#xff0c;打開了一個新工具窗口。點擊remote shell窗口最右上角的小三角&#xff0c;在launch子菜單中選擇local&#xff0c;點擊即可。…

7天學會python_7天學會Python最佳可視化工具Seaborn(五):結構化展示多維數據

當探索具有中等數量(不多不少的意思……)維度的數據集時&#xff0c;一個很好的方式是基于不同的子數據集構建不同的實例&#xff0c;并將它們以網格的方式組織在一張圖之中。這種技術有時被稱為“lattice”或“trellis”(大概是格子圖、網格圖)&#xff0c;這跟“small multip…

面對峰值響應沖擊,解決高并發的三大策略

2019獨角獸企業重金招聘Python工程師標準>>> 當前在互聯網的大潮下&#xff0c;眾所周知淘寶、京東這些交易系統每天產生的數據量都是海量的&#xff0c;每天的交易并發也是驚人的&#xff0c;尤其是“雙11”、“6.18”這些活動&#xff0c;對系統的峰值響應提出了非…

.NET 采用 SkiaSharp 生成二維碼和圖形驗證碼及圖片進行指定區域截取方法實現

在最新版的 .NET 平臺中&#xff0c;微軟在逐步放棄 System.Drawing.Imaging &#xff0c;給出的理由如下&#xff1a;System.Drawing命名空間對某些操作系統和應用程序類型有一些限制。在Windows&#xff0c; System.Drawing 依賴于GDI操作系統附帶的本機庫。 某些Windows SKU…

Linux運維人員必會開源運維工具體系

新手必會用深&#xff08;8-15k&#xff09;標記&#xff0c;老鳥必會深淺藍色(15-25K)標記操作系統&#xff1a;Centos,Ubuntu,Redhat,suse,Freebsd網站服務&#xff1a;nginx,apache,lighttpd,php,tomcat,resin數據 庫&#xff1a;MySQL,MariaDB,PostgreSQLDB中間件&#x…

unity讀取Text

sing UnityEngine;using System.Collections;using System.IO; //需要導入System.IO&#xff0c;主要使用它的File類public class TextTest : MonoBehaviour { private string Mytxt; //用來存放文本內容 void Start() { Mytxt ReadFile("C:\\Users\\Admin\\Desktop\\測試…

hibernate mysql 主從_MYSQL主從復制和寫分離

基礎篇https://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19841.htmlhttps://edu.51cto.com/course/21197.htmlhttps://edu.51cto.com/course/19886.htmlhttps://edu.51cto.com/course/19887.htmlhttps://edu.51ct…

深入剖析Redis系列(五) - Redis數據結構之字符串

前言 字符串類型 是 Redis 最基礎的數據結構。字符串類型 的值實際可以是 字符串&#xff08;簡單 和 復雜 的字符串&#xff0c;例如 JSON、XML&#xff09;、數字&#xff08;整數、浮點數&#xff09;&#xff0c;甚至是 二進制&#xff08;圖片、音頻、視頻&#xff09;&am…

全新升級的AOP框架Dora.Interception[6]: 框架設計和實現原理

本系列前面的五篇文章主要介紹Dora.Interception的編程模式以及對它的擴展定制&#xff0c;現在我們來聊聊它的設計和實現原理。目錄一、調用鏈抽象二、基于約定的攔截器定義三、基于調用上下文的依賴注入容器四、攔截器的提供五、調用鏈的構建六、方法攔截的實現原理七、依賴注…

activemq 安全連接

一、定義用戶組1.1 simpleAuthenticationPlugin通過在activemq.xml中配置用戶組<plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username"admin" password"password" groups"admins,publishers,consumer…