数据存放在数据里面,索引存放在索引里
oracle
myisam就是用的这个堆表的存储方式,oracle支持堆表,pg只支持堆表性能
咱们如今都玩innodb,因此堆表一带而过,重点关注索引组织表
指针
3.一、一个表A,主键值8个字节,每条记录300个字节,每一个page16k,求这张表B+ tree高度为1 能存放多少记录,2呢? 3?
首先,一个页能存放16k/300个记录code
也就是说5000w的记录中找一个主键,只要找三个页,一亿和五百亿都是找四次,因此表变大,查询速度不会有变化,最差的hdd盘,一秒钟能查100次,实际生产中,B+ tree 高度4层差很少了,5层不多,高度越低性能越好blog
DML操做,先找到页,把这个页读到内存中,而后再去操做,只要你内存够大,页全放内存中,快的很索引
B+ tree的好处:查某个范围内,或者某几条数据,或者根据主键来查,很快,可是要把几千万数据查一下还要join那确定慢了,固然也能够作定型、作hash join内存
缺点:插入比较慢hash
3.二、为何主键查询比二级索引查询来的快
主键索引里面包含了每一行完整的数据,只要找到那个主键就是找到那个记录,二级索引,若是查询的列不是索引列,走那个列的索引找到后还要去根据索引里保存的主键去找查询列的内容,这里多了一步,这种查找叫书签查找或者回表,若是一个高度为3的树,原本查只要查三个页,走二级索引就要查六个页it
a b c 三个列,a是主键,b是普通索引innodb
select c from tb; 若是走b列的普通索引,会先找到对应的a,再经过a找到对应的c ①select c where b=? ②select c where a = ?