Mysql大数据优化(二 索引)
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表应该有唯一索引列,直接引用主键索引,避免出现根据主键索引读数据,导致索引太大,从而效率极差