SQL查詢優化

2021-10-23 03:39:19 字數 2079 閱讀 7041

這是大學時候一門課程的內容,悔恨當年沒有好好學,為了工資現在重拾…

索引型別

假設如下

t:查詢花費時間

s:查詢sql需要訪問的資源

v:硬體效能提供的單位時間內所能訪問到的資源量

那麼,t=s/v,我們能做的:

降低s,即減少sql語句所需要訪問的資源,說人話就是盡量查詢更少的行

提高v,即增加硬體系統的吞吐量

關係型資料庫執行計畫本質一樣的,都是對sql耗費的硬體資源和訪問的資料量進行展示。

六種執行計畫,選擇時一般遵循以下規則:

如果sql執行很長時間才出結果或返回不了結果,用方法1:explain plan for

跟蹤某條sql最簡單的方法是方法1:explain plan for,其次是方法2:set autotrace on

如果sql中含有函式,函式中有含有sql,即存在多層呼叫,想準確分析只能用方法5:10046追蹤

想法看到真實的執行計畫,不能用方法1:explain plan for和方法2:set autotrace on

想要獲取表被訪問的次數,只能用方法3:statistics_level = all

邏輯物理

b-tree

single column 單行索引

partitioned 分割槽索引

bitmap 位圖索引

concatenated 多行索引

nonpartitioned 非分割槽索引

normal 正常型b樹

unique 唯一索引

rever key 反轉型b樹

nonunique 非唯一索引

function-based函式索引

domain 域索引

聚集索引:直接決定了記錄的存放位置, 或者說:根據聚集索引可以直接獲取到記錄。

非聚集索引:儲存了二個資訊:1.相應索引欄位的值,2.記錄對應聚集索引的位置(如果表沒有聚集索引則儲存記錄指標)。

seek:尋找;scan:掃瞄

table scan:遍歷整個表,查詢所有匹配的記錄行。這個操作將會一行一行的檢查,當然,效率也是最差的。

index scan:根據索引,從表中過濾出來一部分記錄,再查詢所有匹配的記錄行,顯然比第一種方式的查詢範圍要小,因此比table scan要快。

index seek:根據索引,定位(獲取)記錄的存放位置,然後取得記錄,因此,比起前二種方式會更快。

clustered index scan:和table scan一樣。注意:不要以為這裡有個index,就認為不一樣了。 其實它的意思是說:按聚集索引來逐行掃瞄每一行記錄,因為記錄就是按聚集索引來順序存放的。 而table scan只是說:要掃瞄的表沒有聚集索引而已,因此這二個操作本質上也是一樣的。

clustered index seek:直接根據聚集索引獲取記錄,最快!

mysql索引是在儲存引擎中實現的,不同的儲存引擎不同的索引,一般分為四類

單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引、空間索引

索引型別

單列索引

主鍵索引

primary索引列唯一且不能為空;一張表只能有乙個主鍵索引

單列索引

普通索引

normal索引列沒有任何限制

單列索引

唯一索引

unique索引列的值必須是唯一的,但允許有空

組合索引

組合索引就是把多個列加入到統一個索引中

全文索引

fulltext 用於搜尋很長一篇文章的時候,效果最好。

索引方式

hash:

btree(mysql預設):

參考:

查詢優化 SQL優化

查詢優化注意點 代表查詢速度比較 1 所有查詢必須注意 的使用必要性 cout 1 cout 2 字段 主鍵索引 字段 普通索引 字段 沒有索引 3 乙個字段 多個字段 欄位多越慢 4 大於10000和大於10001的區別 後者大於前者 5 列沒別名 列 有別名6 兩個條件,where時應該將符合資...

查詢優化 sql

查詢1 declare d datetime set d getdate select top 1000 from product where contains name,男上裝 or contains text,男上裝 select datediff ms,d,getdate set d getd...

優化sql查詢

如何寫出高效能的sql語句 執行計畫是資料庫根據sql語句和相關表的統計資訊坐出的乙個查詢方案,這個方案是由查詢優化器自動分析產生的,比如一條sql語句如果用來從乙個n條記錄中查詢其中一條,那查詢優化器會選擇 索引掃瞄 方式。該錶如果使用了歸檔,那查詢優化器就會改變方案,採用 全表掃瞄 方式。執行計...