InnoDB 和 MyISAM 的区别
事务方面
InnoDB支持事务,MyISAM不支持事务。这是Mysql将默认存储引擎从MyISAM变成InnoDB的重要原因之一
外键方面
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MyISAM会失败
索引层面
InnoDB是聚集(聚簇)索引,MyISAM是非聚集(非聚簇)索引。
MyISAM 支持 FULLTEXT 类型的全文索引。
InnoDB不支持FULLTEXT类型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好。
锁粒度方面
InnoDB最小的锁粒度是行锁,MyISAM最小的锁粒度是表锁。
一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。
这也是Mysql将默认存储引擎从MyISAM变成InnoDB的重要原因之一
硬盘存储结构
MyISAM在硬盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。
- .frm 文件存储 表的定义
- 数据文件 的扩展名为 .MYD(MYData)
- 索引文件 的扩展名为 .MYI (MYIndex)
InnoDB存储引擎存储数据库数据,一共有两个文件(没有专门保存数据的文件)
- Frm文件:表的定义文件
- Ibd文件:数据和索引存储文件。数据以主键进行聚集存储,把真正的数据保存在叶子节点中
聚簇索引 和 非聚簇索引
聚簇索引(InnoDB)
将数据存储和索引放到了一块,索引结构的叶子节点保存了行数据
表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致
InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,像组合索引、前缀索引、唯一索引等等
左侧 聚簇索引中 B+树的叶子节点中直接存储了数据
右侧 辅助索引(又称二级索引),右侧的将user_name设置为普通索引,叶子节点存储数据记录主键的key,在通过key去聚簇索引中查询得到叶子节点存储的数据记录
PS:为什么不推荐使用select * ?
如果只查id,通过一次查询即可查出数据,如果使用select * 包含了其他字段,查询次数不止一次导致效率较低
非聚簇索引(MyISAM)
将数据与索引分开存储,表数据存储顺序与索引顺序无关
1、 叶子节点保存的是数据的地址,根据ID在B+树中找到存储该行数据的物理地址
2、根据该物理地址在数据文件中拿到数据
索引失效底层原理
索引为什么会失效:
1、使用最佳左前缀法则:
首先,联合索引,最左侧的数据是有序的,也就是a是有序的,在最满足最左前缀法时,右侧的数据是有序的,当a固定时,b是有序的。
如最下方的图,当我们使用最左边的字段时,假如where a = 1 and b = 1 ,此时,a = 1固定了,b也是有序的,所以使用到了索引。
此时当我们使用 where b = 1 不符合最左前缀法则,在a没有固定的情况下,b是无序的,此时如何在一个无序的B+树上找到你所需要的值?没有走到索引,导致进行了全表查询
2、大于号右边的索引会失效:
比如 where a > 1 and b = 1 根据a >1 的数据 如下图,此时去找b = 1的数据,此时b是无序的,所以无法通过二分查找去查找b的数据,没有使用到索引
此时如果 是 a = 1 则满足索引
3、like索引会失效:
在数据库中,string类型的也会根据26个字母来进行排序,此时如果使用 user_name like 'a%'
此时就满足索引,如果使用user_name like '%a' 或者 user_name like '%a%',同理a右边的字母是无序的,无法使用索引
文章来源:https://www.toymoban.com/news/detail-438585.html
文章来源地址https://www.toymoban.com/news/detail-438585.html
以下用法会导致索引失效:
- 计算,如:+、-、*、/、!=、<>、is null 、 is not null 、 or
- 函数 如:sum() round() 等
- 手动/自动类型转换 如 id ="1",本来是数字,写成了字符串
到了这里,关于Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!