索引概念:
1)聚簇索引:是一种数据存储方式,innodb的聚簇索引实际上实在同一个结构i中保存了b+tree索引和数据行
2)innodb中没有定义主键,则会自动选择一个非空唯一的索引代替。如果没有这样的索引,innodb会隐式的定义一个主键作为聚簇索引
优点:
1)数据访问更快,因为索引和数据在一块,聚簇索引获取数据比非聚簇索引块
2)使用覆盖索引扫描的查询可以直接使用叶节点中的主键值
缺点:
1) 聚簇数据最大限度的提高了io密集型应用的性能,当数据全部加载到内存中,索引失去优势
2)插入严重依赖于插入顺序,如果不是按照主键顺序插入的,最好optimize table重新组织表
3)更新聚簇索引列的代价很高,innodb会强制将每个被更新的行移动到新的位置
4)二级索引(非聚簇索引)占用空间更大,因为二级索引的叶子节点包含了引用行的主键值
二级索引
1) 二级所以访问数据需要两次索引查询
2)二级索引叶子节点报错的不是指向物理位置的指针,而是主键值
3)二级索引查找行,存储引擎需要去二级索引的叶子节点获得对应的主键值,然后根据这个值去聚簇索引中查找对应的行
覆盖索引:
通常情况下,我们以where条件来创建合适的索引,如果mysql可以使用索引直接来获取数据,这样就不用读取数据行(索引的叶子节点已经包含了要查询的数据),则不在需要回表,这样的索引我们成为覆盖索引
覆盖索引能极大的提高查询性能
覆盖索引的好处
1)索引的条目一半远小于数据行大小,如果只需要读取索引,mysql就会极大的减少访问数据量
2)因为索引是按照列的顺序存储的(在单个也内如此),对于io密集型范围查询要比随机io少的多
3)由于innodb的聚簇索引,覆盖索引对innodb表特别有用,innodb的二级索引在子节点保存了行的主键值,所以二级主键能够覆盖查询;则可以避免对主键索引的二次查询。
数据碎片
行碎片:
这种碎片是指数据行存储在多个地方的多个段中,即使查询只从索引中访问一条数据,行碎片也会导致性能下降
行间碎片:
指的是逻辑上顺序的页,但是在磁盘上不是顺序存储的。行间碎片对全表扫面or聚簇索引扫描之类的操作影响很大。因为这些操作原本会在磁盘的顺序存储中获利
剩余空间碎片:
指数据页中有大量的剩余空间,这会导致服务器扫描大量不需要的磁道,造成资源浪费
innodb不会出现短小的行碎片,因为innodb会移动短小的行并重新写到一个片段中