搞清楚这几个问题:
mysql的底层数据结构是什么?是怎样存储元素的?和B-Tree的区别是什么?为什么会选择这种数据做存储?优势是什么?
什么是聚集索引?怎样避免回表查询?
连个存储引擎的区别是什么?
mysql的锁(需要写具体的实现步骤)?什么是乐观锁?什么是悲观锁?分别怎样实现?
答:底层数据结构是B+tree,怎样存储的看下图
和B-tree的区别嘛,再看一下B-tree的存储结构图片
为什么要选择这种数据结构?从以下几方面来说:为什么不用hash做索引?为什么不选平衡二叉树做索引?为什么不选b-Tree做索引?
答:hash索引不支持范围查找和排序功能。
为什么不选平衡二叉树(红黑树)做索引?
索引是存在于索引文件中,是存在于磁盘文件中。因为索引是非常大的,因此无法一次将全部索引加载到内存中。而这个磁盘的读取速度较内存中的读取
速度是差了好几个级别的。而适合作为索引的结构应该是尽可能减少的执行磁盘IO操作,因为执行磁盘IO操作非常耗时。因此,平衡二茶树不适合作为索引。
B-Tree:平衡二叉树没能充分利用磁盘预读功能,而B树是为了充分利用磁盘预读功能而创建的一种数据结构。
聚集索引概念:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
非聚集索引:除了聚集索引都是非聚集索引,存储顺序与逻辑顺序不同。
如何解决非聚集索引的二次查询问题:使用复合索引
InnoDB 聚集索引 的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:
(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则第一个not NULL unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
为什么会回表查询?答:因为有两颗索引树,先普通索引查询,找到聚集索引的索引号,才会去聚集索引树中查找对应的记录。
MyISAM与InnoDB 的区别:
1.noDB支持事务,MyISAM不支持 2,。InnoDB支持外键,而MyISAM不支持
3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
也就是说:InnoDB的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件);
5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了
6.MyISAM表格可以被压缩后进行查询操作
7.InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
8.InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有
9.
Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI
Innodb:frm是表定义文件,ibd是数据文件
Myisam:frm是表定义文件,myd是数据文件,myi是索引文
总结一下两个索引的区别:1.从事务支持上说 2.从聚集索引上说 3.从表文件上说 4.从底层数据存储来说 5.从是否需要主键上说 6.从支持的锁上来说 7.从外键支持上来说 8.从是否支持表的具体行数来说