Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引

这篇具有很好参考价值的文章主要介绍了Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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中,在聚簇索引之上创建的索引称之为辅助索引,像组合索引、前缀索引、唯一索引等等

Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引

左侧 聚簇索引中 B+树的叶子节点中直接存储了数据

右侧 辅助索引(又称二级索引),右侧的将user_name设置为普通索引,叶子节点存储数据记录主键的key,在通过key去聚簇索引中查询得到叶子节点存储的数据记录

PS:为什么不推荐使用select * ?

如果只查id,通过一次查询即可查出数据,如果使用select * 包含了其他字段,查询次数不止一次导致效率较低

非聚簇索引(MyISAM)

数据索引分开存储,表数据存储顺序与索引顺序无关


Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引

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 则满足索引Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引

3、like索引会失效:

在数据库中,string类型的也会根据26个字母来进行排序,此时如果使用 user_name like 'a%' 

此时就满足索引,如果使用user_name like '%a' 或者 user_name like '%a%',同理a右边的字母是无序的,无法使用索引

Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引

Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引文章来源地址https://www.toymoban.com/news/detail-438585.html

以下用法会导致索引失效:

  • 计算,如:+、-、*、/、!=、<>、is null 、 is not null 、 or
  • 函数 如:sum() round() 等
  • 手动/自动类型转换 如 id ="1",本来是数字,写成了字符串

到了这里,关于Mysql-InnoDB索引:普通索引、主键索引、唯一索引、组合索引的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 请你来了解一下Mysql-InnoDB中事务的两段式提交

    A:原子性 原子性表示把一个事务中所有的操作视为一个整体,要么全部成功,要么全部失败,是事务模型区别文件系统的重要特征之一 C:一致性 官方对一致性的解释为事务将数据库从一种状态转变为下一种一致性状态,在事务开始之前和食物结束以后,数据库的完整性约

    2024年01月23日
    浏览(280)
  • 【⑪MySQL | 约束(一)】概念 | 非空 | 唯一 | 主键 | 自增长约束

    ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL约束的概念 | 非空约束 | 唯一约束 | 主键约束 | 自增长约束的分享 ✨ 1. 约束(Constraint)概念 1.1 为什么需要约束 对于已经创建好的表,虽然字段的数据类型决定了所能存储的数据类型,但是表中所存储的数据是否合法并没有进行

    2024年02月16日
    浏览(30)
  • 【MySQL】MySQL表的约束-空属性/默认值/列属性/zerofill/主键/自增长/唯一键/外键

    表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束的本质是通过计数手段,倒逼程序员,插入正确的数据,反过来,站在mysql的视角,凡是插入进来的数据,都是符合约束的 约束的最终模板:保证数据的完整性和可预期性

    2024年02月01日
    浏览(34)
  • mysql中主键索引和联合索引的原理解析

    主键索引 :按照主键数据从小到大按照从左到右进行排序,叶节点只存储数据区; 接着将上面的页生成出来,页只存储索引和指针,指针指向数据域,当通过主键查找数据时,从B+树的头部开始寻址数据、读取数据。 上面为索引页 下面为数据页 查询select * from table where a=6,

    2024年04月08日
    浏览(31)
  • 浅谈mysql的主键和索引

    在上一篇文章《count(1)、count(*)、count(字段)哪个更靠谱》中,我们提到过主键是优化不了count的查询效率的,需要建索引才可以,那么,是不是意味着主键的效率还不如一般的索引呢?怀着这个疑问,我们一起来了解下mysql主键和索引的相关知识。 mysql数据库的MYISAM和InnoDB引擎

    2024年02月08日
    浏览(32)
  • 【Mysql】复合主键的索引

    复合主键在where中使用查询的时候到底走不走索引呢?例如下表: 当执行以下SQL的时候到底走不走索引呢?             Explain结果: 使用索引   使用索引   使用索引   不使用索引   不使用索引   使用索引   结论:Mysql复合主键的顺序十分重要,WHERE查询条件中会按列匹配

    2023年04月25日
    浏览(70)
  • 【MySQL高级】——InnoDB索引&MyISAM索引

      MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。 这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现 高级查找

    2023年04月27日
    浏览(41)
  • 主键、外键、建表范式、MySQL索引、用户管理

    1.1 问题 完成如下练习: 练习主键的创建、查看、删除、添加、验证主键 练习复合主键的使用 练习与auto_increment连用的效果 1.2 方案 主键使用规则: 表头值不允许重复,不允许赋NULL值 一个表中只能有一个primary key 表头 多个表头做主键,称为复合主键,必须一起创建和删除

    2024年01月16日
    浏览(33)
  • MySQL数据库唯一索引

    创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,分别是1.创建表的时候创建索引、2.在已经存在的表上创建索引和使用3.ALTER TABLE语句来创建索引。 本文福利, 莬 费领取Qt开发学习资料包、技术视频,内容包括(C++语言基

    2024年02月08日
    浏览(37)
  • mysql的主键索引为什么不能null

    这是一个非常奇怪且有趣的问题。可以通过官方文档进行解读 https://dev.mysql.com/doc/refman/5.7/en/glossary.html A special value in SQL, indicating the absence of data. Any arithmetic operation or equality test involving a NULL value, in turn produces a NULL result. (Thus it is similar to the IEEE floating-point concept of NaN, “not

    2024年02月14日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包