mysql索引及数据碎片
1)聚簇索引:是一种数据存储方式,innodb的聚簇索引实际上实在同一个结构i中保存了b+tree索引和数据行
2)innodb中没有定义主键,则会自动选择一个非空唯一的索引代替。如果没
索引概念: 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的二级索引在子节点保存了行的主键值,所以二级主键能够覆盖查询;则可以避免对主键索引的二次查询。 数据碎片 行碎片: 这种碎片是指数据行存储在多个地方的多个段中mysql索引表,即使查询只从索引中访问一条数据,行碎片也会导致性能下降 行间碎片: 指的是逻辑上顺序的页,但是在磁盘上不是顺序存储的。行间碎片对全表扫面or聚簇索引扫描之类的操作影响很大。因为这些操作原本会在磁盘的顺序存储中获利 剩余空间碎片: 指数据页中有大量的剩余空间,这会导致服务器扫描大量不需要的磁道,造成资源浪费 innodb不会出现短小的行碎片,因为innodb会移动短小的行并重新写到一个片段中 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |