索引
1.索引的作用
優(yōu)化查詢,類似于書中的目錄
2.算法分類
BTree
RTree
Hash
fulltext
gis
3. 聚集索引和輔助索引構(gòu)成邏輯
4.輔助索引細(xì)分
單列
多列(聯(lián)合索引)
唯一
5.索引樹的高度
(1)數(shù)據(jù)行 分表
(2)索引列值較長(zhǎng) 前綴索引
(3)數(shù)據(jù)類型 char varchar
(4)enum (枚舉) 能用則用
6.索引的管理操作
alter table t100w add index idx_ke(k2); #---> 普通索引
alter table t100w add unique index ind_k1(k1); #---->唯一索引
alter table city add index idx_name(name(5)); #----> 前綴索引
alter table city add index idx_co_po(`CountryCode`,`Population`); #----> 聯(lián)合索引
desc t100w; #-----> 查看索引 (Key (MUL 普通索引)(UNI 唯一索引)(PRI 主鍵索引))
select count(distinct(k1)) from t100w; #----> 查看列重復(fù)行
alter table city drop index idx_name; #---->查出索引
7.執(zhí)行計(jì)劃獲取及分析
7.0介紹
(1)
獲取到的是優(yōu)化器選擇完成的,他認(rèn)為代價(jià)最小的執(zhí)行計(jì)劃.
作用: 語(yǔ)句執(zhí)行前,先看執(zhí)行計(jì)劃信息,可以有效的防止性能較差的語(yǔ)句帶來(lái)的性能問(wèn)題.
如果業(yè)務(wù)中出現(xiàn)了慢語(yǔ)句罕邀,我們也需要借助此命令進(jìn)行語(yǔ)句的評(píng)估,分析優(yōu)化方案。
(2) select 獲取數(shù)據(jù)的方法
1. 全表掃描(應(yīng)當(dāng)盡量避免,因?yàn)樾阅艿?
2. 索引掃描
3. 獲取不到數(shù)據(jù)
7.1查看執(zhí)行計(jì)劃
mysql root@localhost:oldboy> desc select * from t100w\G
***************************[ 1. row ]***************************
id | 1
select_type | SIMPLE
table | t100w #----->查詢的表
partitions | <null>
type | ALL #----->索引類型
possible_keys | <null> #----->可能走的索引
key | <null> #----->走的索引名
key_len | <null> #----->應(yīng)用索引的長(zhǎng)度
ref | <null>
rows | 997527 #-----> 查詢結(jié)果集的長(zhǎng)度
filtered | 100.0
Extra | <null> #----->額外信息
7.2 type 索引的應(yīng)用級(jí)別
ALL : 全表掃描斜纪,不走索引
沒(méi)建立索引!文兑!
建立索引不走的():懈铡!B陶辍因块!
mysql> desc select * from t100w;
mysql> desc select * from t100w where k1='aa';
(輔助索引)
mysql> desc select * from t100w where k2 != 'aaaa';
mysql> desc select * from t100w where k2 like '%xt%';
Index :全索引掃描
mysql> desc select k2 from t100w;
range :索引范圍掃描
輔助索引 : > < >= <= like , in or
主鍵: !=
mysql> desc select * from world.city where countrycode like 'C%'
mysql> desc select * from world.city where id!=3000;
mysql> desc select * from world.city where id>3000;
mysql> desc select * from world.city where countrycode in ('CHN','USA');
改寫為:
desc
select * from world.city where countrycode='CHN'
union all
select * from world.city where countrycode='USA';
ref : 輔助索引等值查詢
mysql> desc select * from city where countrycode='CHN';
eq_ref :在多表連接查詢是on的條件列是唯一索引或主鍵
mysql> desc select a.name,b.name ,b.surfacearea
from city as a
join country as b
on a.countrycode=b.code
where a.population <100;
const,system : 主鍵或唯一鍵等值查詢
mysql> DESC SELECT * from city where id=10;
7.3. explain(desc)使用場(chǎng)景(面試題)
題目意思: 我們公司業(yè)務(wù)慢,請(qǐng)你從數(shù)據(jù)庫(kù)的角度分析原因
1.mysql出現(xiàn)性能問(wèn)題,我總結(jié)有兩種情況:
(1)應(yīng)急性的慢:突然夯住
應(yīng)急情況:數(shù)據(jù)庫(kù)hang(卡了,資源耗盡)
處理過(guò)程:
1.show processlist; 獲取到導(dǎo)致數(shù)據(jù)庫(kù)hang的語(yǔ)句
2. explain 分析SQL的執(zhí)行計(jì)劃,有沒(méi)有走索引,索引的類型情況
3. 建索引,改語(yǔ)句
(2)一段時(shí)間慢(持續(xù)性的):
1.記錄慢日志slowlog,分析slowlog
2.explain 分析SQL的執(zhí)行計(jì)劃,有沒(méi)有走索引,索引的類型情況
3.建索引,改語(yǔ)句
8. 索引應(yīng)用規(guī)范
業(yè)務(wù)
1.產(chǎn)品的功能
2.用戶的行為
"熱"查詢語(yǔ)句 --->較慢--->slowlog
"熱"數(shù)據(jù)
8.1.9 建索引原則
(1) 必須要有主鍵,如果沒(méi)有可以做為主鍵條件的列,創(chuàng)建無(wú)關(guān)列
(2) 經(jīng)常做為where條件列 order by group by join on, distinct 的條件(業(yè)務(wù):產(chǎn)品功能+用戶行為)
(3) 最好使用唯一值多的列作為索引,如果索引列重復(fù)值較多,可以考慮使用聯(lián)合索引
(4) 列值長(zhǎng)度較長(zhǎng)的索引列,我們建議使用前綴索引.
(5) 降低索引條目,一方面不要?jiǎng)?chuàng)建沒(méi)用索引,不常使用的索引清理,percona toolkit(xxxxx)
(6) 索引維護(hù)要避開業(yè)務(wù)繁忙期
8.10 關(guān)于聯(lián)合索引
(1)where A group by B order by c #--->(A,B籍铁,C)
(2)where A B C
(2.1)都是等值涡上,在5.5 以后無(wú)關(guān)索引順序,把空一個(gè)原則唯一值多的列放在聯(lián)合索引最左側(cè)拒名。
(2.2)如果有不等值
select where A= AND B> AND C=
索引順序吩愧,ACB ,語(yǔ)句改為ACB