索引数据结构
索引是帮助MySQL高效获取数据的排好序的数据结构
Hash表 和 B-Tree 比较
- Hash通过对索引的hash快速获取地址值直接获取数据,在对索引的查询效率上高于B-Tree
- Hash表通过List和红黑树对数据进行查询
- IO查询次数上方面:红黑树是二叉树,数据量大的情况下,树的层数高于B-Tree。使用Hash存取结构,会导致IO次数过高,而B-Tree只需要很少的查询次数。
- 数据量很少的时候:Hash查找只是查找单个值,但是数据库查找离不开范围查找,例如
select * from table where id > 10
,这种情况下Hash能够快速的查到id=10
的这个值,但是并不知道id > 10的值又有哪些。而B+Treede叶子节点的连续指针可以快速方便的进行范围查找。
MyISAM 和 InnoDB比较
- 事务支持: MyISAM不支持事务,InnoDB支持事务
- 外键: MyISAM不支持外键,InnoDB支持外键
- 索引:MyISAM是非聚集索引(索引和数据不在同一位置存储),索引查找到的值是磁盘中的地址,通过地址找到数据,是两次查询也就是回表。InnoDB说是聚集索引(索引和数据在一起存储),B+Tree子节点的数据就是所要查找的数据而不是数据的地址,这种方式可以少一次查询,提高查询效率。因此InnoDB一定要有主键,建议是自增主键,因为占用存储较少,提高存储量。
- 具体行数:InnoDB不保存表的具体行数,
select count(*) from table
需要扫描全表。MyISAM用一个变量保存了表的行数。 - 锁: InnoDB最小锁粒度是行锁,MyISAM最小锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞。