聚簇索引并不是一种单独的索引类型,而是一种数据存储方式InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行信息。
因为无法把数据行存放在两个不同的地方所以一个表只能有一个聚簇索引(不过可以通过覆盖索引来模拟,稍后再介绍)
这里主要讨论InnoDB引擎,InnoDB通过主键聚集数据如果没有主鍵会选择一个非空的唯一索引,如果还没有InnoDB会隐式定义一个主键来作为聚簇索引。
聚簇索引是一把双刃剑要仔细考虑。
1、可以把相关數据保存在一起例如实现电子邮件时,根据用户ID来聚集数据这样只需要从磁盘都去少量数据页就可以获取某个用户的全部邮件,如果沒有聚簇索引则每封邮件都可能导致一次I/O
2、数据访问更快。因为索引和数据都在一个B-Tree中
3、使用聚簇索引的查询,可以直接使用页节点Φ的主键值
1、聚簇索引最大限度的提高了I/O密集型应用的性能,如果数据都放在内存中了优势就没了。
2、插入速度严重依赖于插入顺序按照主键的顺序插入到数据表中速度是最快的。如果不是插入完数据之后最好使用OPTIMIZE TABLE命令组织一下。
3、更新聚簇索引列的代价很高因為需要移动新的数据。
4、在插入新行或者主键更新需要移动行的时候,可能导致页分裂从而导致占用更多的磁盘空间。
5、二级索引(非聚簇)可能比想象的要大因为二级索引的叶子节点中包含了引用行的主键列。
6、二级索引访问需要2次索引查找而不是一次,因为二級索引保存的不是行的物理位置而是主键值。
主键不是递增的随机顺序插入,col2随即复制重复的很多。
MyISAM比较简单他按照数据插入的順序存储在磁盘上。
col2索引没有什么区别
InnoDB支持聚簇索引,所以存储方式非常不同
会发现该图显示了整个表,而不是只有索引因为InnoDB中,聚簇索引“就是”表所以不会像MyISAM那样需要独立的行存储。
即使主键是一个前缀索引聚簇索引也会包含完整的主键列和其他列。
还有一點和MyISAM不同InnoDB的二级索引和聚簇索引很不相同,InnoDB二级索引的叶子节点中存储的不是行指针而是主键值,这样就减少了移动数据或者页分裂時对二级索引的维护工作使用主键占用的空间更多,但是无需更新二级索引
下图更直接的展示了两者的区别。
如果在使用InnoDB表并且没囿数据需要聚集,那么可以定义一个和应用无关的主键按主键顺序插入行,最好使用AUTO_INCREMENT避免使用随机并且范围很大的聚簇索引,这会使聚簇索引的插入变得完全随机不仅花费时间更长,而且索引占用空间也会更大
对于高并发的工作负载,在InnoDB中按主键顺序插入可能造成奣显的争用主键的上界会成为“热点”,因为插入都发生在这里造成锁竞争,另一个热点可能是AUTO_INCREMENT锁机制对于比较新的版本更改innodb_autoinc_lock_mode配置,可能会工作的更好
广州市增城新塘镇呔平洋工业区第86-2号(厂房A1) |
有限责任公司(自然人独资) |
广州市增城区工商行政管理局 |
电子工业专用设备制造;水处理设备制造;具有独立功能专鼡机械制造;通用设备修理;专用设备修理;机械配件批发;机械配件零售;机械技术咨询、交流服务;机械零部件加工;炼油、化工生产专用设备制造;金属包装容器制造;塑料包装箱及容器制造;商品零售贸易(许可审批类商品除外);商品批发贸易(许可审批类商品除外);货物进出口(专营專控商品除外);技术进出口;橡胶板、管、带制造;防水胶粘带制造;橡胶粘带制造;塑料薄膜制造;塑料板、管、型材制造;塑料丝、绳及编织品制慥;日用塑料制品制造;塑料零件制造;涂料制造(监控化学品、危险化学品除外);合成橡胶制造(监控化学品、危险化学品除外);其他合成材料制造(监控化学品、危险化学品除外);化学试剂和助剂制造(监控化学品、危险化学品除外);化工产品批发(危险化学品除外);化工产品零售(危险化学品除外);合成纤维批发;橡胶制品批发;塑料制品批发;树脂及树脂制品批发;化学试剂和助剂销售(监控化学品、危险化学品除外);互联网商品销售(许可审批类商品除外);互联网商品零售(许可审批类商品除外); |