這是大學時候一門課程的內容,悔恨當年沒有好好學,為了工資現在重拾…索引型別
假設如下
那麼,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條記錄中查詢其中一條,那查詢優化器會選擇 索引掃瞄 方式。該錶如果使用了歸檔,那查詢優化器就會改變方案,採用 全表掃瞄 方式。執行計...