about MySql Innodb Index

  1. 什么是索引

  索引是一种数据结构,通常是B-tree、Hash,它存储的是一个表中特定列(一列或多列)的值。它的用途是帮助数据库高效获取数据,快速的找到指定key对应的value或values。其本质就是通过映射来实现的快速查找,从而避免全表扫描。

  1. B+树是怎么回事

  B+树代表的是平衡树而不是二叉树,是MySql常用的索引类型,主要解决如何通过key快速的找到对应的数据,为磁盘或其它存取辅助设备设计的一种平衡查找树。

B+树是由二叉查找树、平稳二叉树、B树演化而来。B+树的高度一般为2到4,有效的减少了查找磁盘的次数。

B+树操作:https://yq.aliyun.com/articles/9280

通过上面文章的介绍可以看出,创建索引是有开销的。B+树为了维持平衡,随着数据的变化(增加、删除),B+树会进行分裂或合并,分裂或合并涉及到磁盘page页的操作,会有一定的开销。

  1. Hash索引

  hash索引由于其结构,所以在每次查询的时候直接一次到位,不像b-tree那样一点点的前进。所以hash索引的效率高于b-tree,但hash也有缺点,主要如下:

(1)由于存放的是hash值,所以仅支持<=>以及in操作.

(2)hash索引无法通过操作索引来排序,这是因为存放的时候经过hash计算,但是计算的hash值和存放的不一定相等,所以无法排序.

(3)在组合所以里,无法对部分使用索引.

(4)不能排序

Innodb中使用的自适应hash索引,是由存储引擎来执行,无法干预。

  1. 聚集索引

  聚集索引按照每张表的主键构造一棵B+树,叶子结点中包含了完整的数据记录,叶子结点也可以称之为数据页。聚集索引只能是主键,如果没有主键将找一个不包含null的唯一索引,如果再找不到数据库会自动创建一个隐藏的主键。

  1. 普通索引(辅助索引)

  与聚集索引的区别是叶子结点不包含行记录的数据,除了本身的键值还包含一个书签(bookmark),就是行记录相应的主键。因此通过普通索引查询首先通过叶子结点找到符合记录的结果集,再通过主键索引找到一个完整的行记录。注意这里面不是指向行记录的指针,因为随着数据的变化,B+树会分裂或者合并,叶子结点的位置也会发生变化。

  1. 最左原则是怎么回事

  联合索引是以元组的形式进行排序的,如(cityid,companyid)作为联合主键(索引)时,其叶子层的顺序可能是:(3,157),(3,158),(3,200),(5,34),(5,158),(7,90),可以看到是先按照cityid进行排序,然后再按照companyid排序,对于cityid来说是递增的,而对于companyid是无序的。

最左原则索引应用情况分支:

查询条件 索引情况  
where cityid = 3 应用索引  
where companyid = 158 不应用索引  
where cityid = 3 and companyid = 158 应用索引  
where companyid = 158 and cityid = 3 应用索引 执行计划会对此进行优化
  1. 覆盖索引

通过辅助索引就可以得到查询的记录,而不需要查询主键对应的行记录。优点包括:

  • 辅助索引不包括整行记录的所有信息,故其大小远小于聚集索引,减少IO操作
  • 辅助索引包含了所有信息,不用再通过主键查询行记录,减少IO操作

可以通过explain中的extra选项看出来是否走覆盖索引,如果有using index就是走的覆盖索引

对于上述的联合索引下面几个sql都走覆盖索引

  • select cityid,companyid from cc_table
  • select cityid,companyid from cc_table where companyid=158
  • select count(*) from cc_table where companyid=158
  1. 执行explain

https://segmentfault.com/a/1190000008131735

时间: 2024-11-04 16:56:48

about MySql Innodb Index的相关文章

MySQL SHOW INDEX语法的实际应用

以下的文章主要描述的是MySQL SHOW INDEX语法的实际操作用法以及其实际查看索引状态(语法)的具体内容的描述,如果你对这一技术,心存好奇的话,以下的文章将会揭开它的神秘面纱. SHOW INDEX FROM tbl_name [FROM db_name] MySQL SHOW INDEX会返回表索引信息.其格式与ODBC中的SQLStatistics调用相似. MySQL SHOW INDEX会返回以下字段: Table 表的名称. Non_unique 如果索引不能包括重复词,则为0

使用mysql innodb 使用5.7的json类型遇到的坑和解决办法

---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建虚拟列 ALTER TABLE temp ADD host varchar(128) GENERATED ALWAYS AS (json_extract(data,'$.Host')) VIRTUAL; #给虚拟列创建索引 ALTER TABLE temp ADD INDEX index_temp_hos

巧用MySQL InnoDB引擎锁机制解决死锁问题(转)

该文会通过一个实际例子中的死锁问题的解决过程,进一步解释innodb的行锁机制 最近,在项目开发过程中,碰到了数据库死锁问题,在解决问题的过程中,笔者对MySQL InnoDB引擎锁机制的理解逐步加深. 案例如下: 在使用Show innodb status检查引擎状态时,发现了死锁问题: *** (1) TRANSACTION: TRANSACTION 0 677833455, ACTIVE 0 sec, process no 11393, OS thread id 278546 starti

关于MySQL InnoDB表的二级索引是否加入主键列的问题解释

关于MySQL InnoDB表的二级索引是否加入主键,总结如下: 1对于MySQL InnoDB表的二级索引是否加入主键,官方也有明确的说明,建议线上MySQL的二级索引创建时强制加入主键所有的列,可以做到所有的MySQL 版本统一. 2.MySQL 5.6.9之前,InnoDB引擎层是会对二级索引做自动扩展,但是优化器不能识别出扩展的主键. 3.MySQL 5.6.9开始InnoDB引擎层是会对二级索引做自动扩展,优化器能识别出扩展的主键. 4.索引的大小一样,二级索引有没有加入主键列,在In

从一个死锁看mysql innodb的锁机制

背景及现象 线上生产环境在某些时候经常性的出现数据库操作死锁,导致业务人员无法进行操作.经过DBA的分析,是某一张表的insert操 作和delete操作发生了死锁.简单介绍下数据库的情况(因为涉及到真实数据,这里做了模拟,不影响具体的分析和分析的结果.)假设存在如下2张表: Order 表的数据如下: Customer表的数据如下: Order和Customer 在实体关系上存在一个关联,即order实体拥有一个指向customer实体的指针.在数据库设计的时 候,order表的custome

Mysql InnoDB行锁实现方式(转)

Mysql InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的.InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁! 在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能.下面通过一些实际例子来加以说明. (1)在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行

[转]关于MYSQL Innodb 锁行还是锁表

关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 做项目时由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统.假设 id=1 的这本书库存为 1 ,但是有 2 个人同时来借这本书,此处的逻辑为 Select   restnum from book where id =1 ;     -- 如果 restnum 大于 0 ,执行 update  U

MySQL InnoDB四个事务级别 与 脏读、不反复读、幻读

MySQL InnoDB事务隔离级别脏读.可反复读.幻读 希望通过本文.能够加深读者对ySQL InnoDB的四个事务隔离级别.以及脏读.不反复读.幻读的理解. MySQL InnoDB事务的隔离级别有四级,默认是"可反复读"(REPEATABLE READ). ·        未提交读(READUNCOMMITTED). 还有一个事务改动了数据,但尚未提交.而本事务中的SELECT会读到这些未被提交的数据(脏读). ·        提交读(READCOMMITTED).本事务读取

MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读

MySQL InnoDB事务隔离级别脏读.可重复读.幻读 希望通过本文,可以加深读者对ySQL InnoDB的四个事务隔离级别,以及脏读.不重复读.幻读的理解. MySQL InnoDB事务的隔离级别有四级,默认是"可重复读"(REPEATABLE READ). ·        未提交读(READUNCOMMITTED).另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读). ·        提交读(READCOMMITTED).本事务读取到的