堆表 :
堆就是无序数据的集合,索引就是将数据变得有序,在索引中键值有序,数据还是无序的
数据存放在数据里面,索引存放在索引里
堆表中,主键索引和普通索引一样的,叶子节点存放的是指向堆表中数据的指针(可以是一个页编号加偏移量),指向物理地址,没有回表的说法
堆表中,主键和普通索引基本上没区别,和非空的唯一索引没区别
mysql 的 myisam 引擎,oracle pg 都支持的是堆表
索引组织表:必须有主键
innodb 引擎支持的就是索引组织表
对于主键的索引,页子节点存放了一整行所有数据,其他索引称为辅助索引(二级索引),它的页子节点只是存放了键值和主键值
主键包含了一张表的所有数据,因为主键索引的页子节点中保存了每一行的完整记录,包括所有列。如果没有主键,MySQL会自动帮你加一个主键,但是对用户不可见
innodb中数据存放在聚集索引中,换言之,按照主键的方式来组织数据的
其他索引(唯一索引,普通索引)的页子节点存放该索引列的键值和主键值
不管是什么索引非页子节点存放的存放的就是键值和指针,不存数据,这个指针在innodb中是6个bit,键值就看数据大小了
两种存储引擎
myisam可以没有索引,主键索引和普通索引一样,叶子节点都存储的都是数据的物理地址。支持表锁,不支持事务
innodb默认行号建立主键索引,数据在叶子节点上。普通索引上面存储的是自己的键值和主键索引,所以查询需要回表。行锁表锁
1、分区
分区键必须是主键的一部分,添加唯一索引,分区键也必须包含在唯一索引中
2.什么是分表?
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
3.什么是分区?
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。
4.mysql分表和分区有什么联系呢?
都能提高mysql的性高,在高并发状态下都有一个良好的表现。
分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。
分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。
表分区相对于分表,操作方便,不需要创建子表。