首先声明,非本人同意不得转载!!!
索引原理
Hash索引,在MySQL中只有Memory引擎支持
当Hash索引中出现哈希冲突的时候,存储引擎需要遍历链表中所有的行,找到所有符合条件的数据。
冲突越多,索引代价越大。
<=> 并非 <>
Mysql 的 InnoDB引擎 有一个功能叫做“自适应哈希索引”。当MySQL发现某些索引值被频繁使用时,会在内存中基于BTree索引创建一个哈希索引。整个过程无法认为控制,仅可以通过innodb_adaptive_hash_index属性配置是否开启,默认开启该功能。
InnoDB聚簇索引(主键索引)
已满的页中,如果需要插入新的数据,会导致页分裂
InnoDB二级索引
Select id,name from tablename where name=’Rose’; #只需要遍历二级索引即可得到结果。
Myisam引擎索引
Myisam引擎中,主键索引与其他索引在结构上没有区别。
InnoDB中默认最大填充因子是页的15/16大小 MySQL默认每页16K 数据达到15K的时候, 分配到下一页。 不同页之间可能不是顺序的,只是通过一个指针相连。
InnoDB主键最好是连续递增的值,尽量避免使用UUID之类的长而无需的字符串。使用UUID做主键,在BTree的聚簇索引上,会导致插入速度慢,索引空间更大,其他二级索引空间也会更大。
索引空间变大的原因有两个,一个是由于主键字段更长,其次是因为页分裂和碎片(页不饱和)导致。
索引列的字段要尽可能小 因为BTree索引树高度页的大小以及页里面的数据大小决定的。数据越小,磁盘块存储的数据越多,树的高度越低,查询性能越高。
三星索引:
1、索引将相关的记录放到一起(Where子句后面的条件都可以使用索引,体现组合索引的利用)
2、索引中数据的顺序和查找中的排列顺序一致(利用索引的有序性直接得到排序结果)
3、索引中的列包含了查询中全部需要的列(利用索引中的值,直接得到查询结果,避免回表)