Mysql大数据优化(二 索引)

2018-06-08  本文已影响0人  会写bug的鸟

myisam的btree索引

frm结构,myd数据,myi索引

show warnings

sxplain的key len代表使用了索引的字节长度

myisam使用非聚簇索引

myisam索引指向行在磁盘上的位置

Innodb的索引

聚簇索引

索引文件和数据文件存储在同一个文件

逐渐如果没有规律,会导致页分裂(主键索引带着聚簇数据在磁盘上一直换位置)

索引覆盖

说明出现索引覆盖情况, 极佳sql

Innodb的特殊问题

第三四条sql是innodb的查询速度

索引区分度

对于左前缀不容易区分的列

建多列索引的原则, 一定要分析区分度

出现filesort情况必须优化, 原因order by的字段没有走索引或者where条件和order by的字段不一致导致where占用索引,order by 被迫使用filesort, 查全表同样会出现filesort, 因为mysql直接返回所有数据,再进行排序

当一条查询sql触发索引的时候,MySQL底层会自动把where条件和索引顺序匹配,但是如果sql的第一个where或by不能触发索引,则mysql底层不会把查询where或by的条件和索引匹配

例如:索引 index(a,b,c,d)

sql  where a=1 , b=2 d>4, c= 3,那好, keylen 为4, 触发索引所有列

sql where b=2,d>4, c=3 那好没有处罚索引

例如:  tag和article关连表

aid tid 1  1

1  2

index(aid, tid)

当join联查时如果根据文章查标签可以触发索引

但是根据标签查文章就不能触发索引

最好的解决办法

index(tid,aid)冗余索引

主要原则, 以客户端为主,分析表的所有sql, 然后去重,保留三个左右的索引原则

表修复

自我总结:Innodb表应该有唯一索引列,直接引用主键索引,避免出现根据主键索引读数据,导致索引太大,从而效率极差

上一篇下一篇

猜你喜欢

热点阅读