mysql 分组占比_含泪整理MySQL索引
索引優化分析
性能下降SQL慢
查詢語句寫的差
索引失效
單值索引
多值索引
關聯查詢太多join(設計缺陷或不得已的需求)
服務器調優以及各個參數設置(緩沖、線程數等)
執行時間長
等待時間長
常見通用的JOIN查詢
共有的INNER JOIN
左表的共有 LEFT JOIN
右表的共有 RIGHT JOIN
左邊獨有 where b.key is null
全鏈接 full outer join
ab都沒用a.key is null or b.key is null
索引簡介
是什么
排好序。
查詢快。
數據庫系統還維護著滿足特定查找算法的數據結構。B+TREE索引(此處不展開討論)
索引:是幫助MySQL高效獲取數據的數據結構,可以得到索引的本質。索引是一種數據結構。
高效查詢,類似新華字段。
排好序的快速查找數據結構。(order by …)
優勢
提高索引的檢索效率,降低數據庫的IO成本。
通過數據進行排序,降低數據的排序成包,降低了cpu的消耗。
劣勢
實際上索引也是一張表,該表保存了主鍵索引字段,并指向實體表的數據,占空間。
索引提高了查詢,但是降低了更新。
提高效率的一個因素,如果有大數據量的表,花時間建立最優秀的索引,或者優化查詢。
MySQL索引分類
單值索引
一個索引只包含單個列,一個表可以有多個單列索引。
唯一索引
索引列的值必須唯一,但允許有空值。
復合索引
一個索引包含索格列
基本語法
哪些需要創建索引
主鍵索引
頻繁查詢
外鍵管理
組合索引
排序字段
統計或分組
哪些情況不需要創建索引
表記錄少
300百萬就差不多開始優化
經常增刪改的不創建索引
重復的值
MySQL索引結構
BTree索引
Hash索引
full-text全文索引
R-TREE索引
性能分析
一、MySQL常見的性能瓶頸
cpu飽和
io內存
硬件瓶頸,top,free,iostat,vmstat
是什么
模擬優化器執行的SQL查詢語句,從而知道MySQL是如何處理SQL語句的,分析查詢語句或者表結構。
能干什么
Explain + sql
表的讀取順序
數據讀取操作的操作類型
哪些索引可以被使用
哪些哪些索引實際被使用
表之間的引用
每張表有多少行被優化器查詢
二、Explain每個字段的詳細描述
id
數字大的優先級高。(derived衍生)
id不同,如果是子查詢,id的需要會遞增,id值越大優先級越高,先被執行。
id相同,執行順序從上往下
id相同與不同,同時存在。
select_type
有哪些?
simple
簡單的select查詢,查詢中不包含子查詢或者union
primary
查詢中若包含任何復雜的子部分,最外層查詢則被標記為primary
subquery
在select 或者where 列表中包含了子查詢
derived(衍生)
在from列表中包含的子查詢被標記為derived,MySQL會遞歸執行這些子查詢,把結果放在臨時表里。
union
若第二個select出現在union之后,則被標記為union。若union包含在from子句的子查詢中,外層select被標記為derived.
union result
兩個union查詢的結果。
查詢的類型,主要是用于區別普通查詢,聯合查詢,子查詢等復雜查詢
type
類型有:all,index,arnge,ref,eq_ref,const,system,null
system
表只有一行記錄,平時不會出現,忽略不計
const
一次索引,用于比較primary 或者union 索引。因為只匹配一行記錄。例如將主鍵置于where列表,MySQL就能將該查詢轉換成一個常量
eq_ref
唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或者唯一索引
ref
非唯一性索引掃描,返回匹配某個單獨的所有行。本質上也是一種索引訪問,它返回所有匹配某個單獨值的行。可能會找到多個符合條件的行,所以屬于查找和掃描的混合體。
range
只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。一般就算在where語句中出現的between,<>,in,等的查詢。這種范圍掃描比全表掃描要好,因為它只需要開始結束于索引的兩個點,不用全表索引。
index
index與all區別為Index只遍歷索引樹。
all
全表掃描
possible_keys
可能用到的索引。一個,多個。
不一定被實際查詢引用。
key
實際使用到的索引。
查詢中若使用到了全文索引
覆蓋索引:查詢的字段和索引字段一一對應。(查詢列要被所建的索引覆蓋)
key_len
索引使用的字節數。索引字段的最大可能的長度,不是實際。(越小越好)
ref
顯示索引的那一列被使用。最好是常量
rows
大致讀到的行數。
Extra
在沒用group by 子句的情況下,基于索引優化min/max操作或者對用MyIAAM存儲引擎優化count()操作,不必等到執行階段再進行計算。查詢執行計劃生成階段即完成優化。
表示使用了覆蓋索引,避免了訪問表的數據行。如果同時出現了using where,表明索引被用來執行索引鍵值的查找。如果沒用同時現象using where ,表明縮影用來讀取數據而非執行查詢動作。
新建了內部的臨時表,常見于order by 和分組查詢group by
mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成的排序操作稱為文件排序。(排序未命中索引)
using firesort
sql+\G
using temporary
using index(還可以哦)
using where
using join buffer:使用了連接緩存
impossible where:不能獲取到任何元素
select tables optimized away
distinct:找到第一個匹配的元組后就收工。
從最好到最差system>const>eq_ref>ref>i>range>index>all
一般來說,保證查詢至少達到range級別,最好能達到ref
性能分析
一、索引分析
單表索引
兩張表
左鏈接加到右表
右鏈接加到左表
三張表
加到后面兩張表
結論
小結果集驅動大結果集
優先優化內部循環
join buffer的設置
二、避免索引失效
全值索引最好
最左匹配法則
不在索引列上做任何操作(計算,函數,類型轉換,會導致索引失效而轉向全表掃描)
存儲引擎不能使用索引范圍條件右邊的列(范圍之后全失效)
盡量使用覆蓋索引。不要select *
mysql在使用不等于(!=或者<>)的時候無法使用索引導致全表掃描
is null,is not null也無法使用索引(索引失效)(%加右邊)
解決辦法:覆蓋索引。
like 以通配符開通(%aaa)索引也會失效,變成全表掃描
字符串不加單引號索引失效
少用or,用它來連接時會索引失效
我是失憶,一個熱愛技術的宅男,文章有任何問題您都可以在留言中指出。歡迎留言。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的mysql 分组占比_含泪整理MySQL索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中怎么做分组问题_详解Pyt
- 下一篇: 将数据导入到mysql_06955.10