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