首页 > 数据库 >Mysql索引的一二三问

Mysql索引的一二三问

时间:2022-11-07 02:11:06浏览次数:87  
标签:hash 记录 全文索引 一二三 查询 索引 Mysql 左匹配

下面文章整理下我对mysql索引的理解

1、什么是索引

索引和表的关系可以类比于目录和书籍,它们的存在就是为了更快地检索到记录,在mysql中,索引是表的一部分,是数据记录的引用指针,只要我们愿意,我们可以设置任何一列为索引,使用的语法是index index_name(column_name1,column_name2),如果没有特别的要求,那么这个索引就是普通索引,如果使用unique index进行约束,那么这个索引就是唯一索引,如果使用primary key修饰某个字段,那么这个字段就是主键索引,如果索引包含很多列,也可以叫联合索引,上面这些都是索引的逻辑上的分类

2、索引的分类

索引可以根据数据结构,硬盘的存储方式,概念上划分为不同索引,数据结构上常见的有hash索引,b+树索引,物理存储上可以分为聚簇索引,非聚簇索引,逻辑上可以分为普通索引,唯一索引,主键索引,全文索引,联合索引。

3、索引的数据结构

常见的有hash索引和b+树索引。在不同的场景中,各有各的优势

3.1 hash索引

hash索引目前只有Memory引擎支持,hash索引的优点就是查询速度快,时间复杂度为O(1),但缺点也很明显,一是hash索引不支持范围查询,只支持等值查询,二是hash索引不支持排序操作,因为索引的大小顺序和hash后的顺序可能不太一样,三是hash索引不支持联合索引中最左匹配原则,因为hash索引,要将所有字段合并后才算hash值

3.2 B+树索引

对于B+树的理解可以看https://blog.csdn.net/jiang_wang01/article/details/113739230这位博主的文章,清晰地对比了B+树对比B树的优势,B+树的思想是二分查找,同时真正的数据存储在叶子结点,叶子结点通过链表进行串联,这样我们在范围查询的时候只要找到min和max就能定位到这段数据

4、索引的物理存储

分为聚簇索引和非聚簇索引,根本区别是数据记录的顺序是否按照索引顺序排序,聚簇索引是唯一的,它的优点就是查询快,只要找到第一个索引的记录,其余连续性的记录在磁盘中也是连续存放的,缺点就是插入新记录慢,因为涉及到相关的数据重新排序,非聚簇索引就相反,可以存在多个,同时由于B+树的叶子节点是记录的指针,所以缺点就是有时候要有回表操作,查询时可以利用覆盖索引避免回表

5、什么是全文索引

某些text字段充当普通索引时只能匹配字段最开始的几个字母(这也是最左原则的体现),所以为了可以更快检索这种场景,可以使用全文索引,
SELECT * FROM tablename
WHERE MATCH(column1, column2) AGAINST(‘word1′, ‘word2′, ‘word3′)
上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来.(例子来源于https://www.cnblogs.com/bruce1992/p/13958166.html)
不过,老版本innode不支持全文索引,1.2以后支持全文索引

6、添加索引的原则

一是查询比较少的字段不能添加索引,二是修改频繁的字段不应该添加索引,三是离散值较少的字段不能添加索引

7、最左匹配原则

最左匹配指的是联合索引时建立索引的原则,比如(name,id)会在name和(name,id)建立索引,不会对id建立索引,最左匹配原则的原理是B+树根据索引的最左的字段构建,非叶子节点根据第一个关键字进行二分,叶子节点是联合索引所有关键字的数据,所有数据根据第一个关键字排序,第二、三、四无序,当第一个第一关键字相同时,第二个关键字就有序了啊,所以当查询的时候遇到between和大于小于,后面的索引就失效了,因为后面就不是有序的了(参考https://cloud.tencent.com/developer/article/1774781),此外,因为mysql有优化器,查询条件会自动排成联合索引的顺序

8、联合索引的好处

一是联合索引减少创建索引的开销,创建一个索引等于创建n个索引,二是减少检索量,第一个索引可以排除一些数据,第二个索引可以排除剩下的一些数据,三是可以利用覆盖索引,减少回表

9、索引失效的场景

思考B+树和联合索引以及最左匹配的原理能得到不遵守最左匹配原则会失效,between和大于小于右边会失效,%在最开头会失效(https://cloud.tencent.com/developer/article/1704743)
二是索引失效考虑的是检索成本,比如is null,is not null有时会走,有时不会走,sql优化器在使用二级索引的时候会预估记录的条数,如果比例过大,那么优化器就偏向直接走聚簇索引

未完继续。。。。

标签:hash,记录,全文索引,一二三,查询,索引,Mysql,左匹配
From: https://www.cnblogs.com/spark-cc/p/16864761.html

相关文章

  • MySQL数据库如何改名
    前戏有时候生产环境是以项目来命名,有时候会出现更名情况,其实如何安全的更改数据库名,是个非常棘手的问题,特别是针对MySQL来数据库来说被取消的命令MySQL之前提供了一个re......
  • MySQL可重复读隔离级别并没有完全解决幻读
    MVCC产生幻读的场景两种读法解决幻读的方法快照读:使用快照ReadView,插入的数据,他的事务号也是插入任务所属的那个事务,只需要照常检查这个事务是否是可见的即可当前......
  • Mysql 之MVCC
    mvcc介绍MVCC是数据库提供并发访问控制的一种技术。其核心理念是数据快照,不同的事务访问不同版本的数据快照,从而实现不同的事务隔离级别。虽然是说具有多个版本的数据快照......
  • Mysql 主从复制 之宝塔篇
    链接:https://blog.csdn.net/qq_30180559/article/details/836286161.在两台服务商分别按照好宝塔及其数据库2.分别在两台服务器上创建数据库2.1假设一号服务器:192.1......
  • MySQL_子查询_exists后面的子查询使用
    语法Exists(完整的查询语句)结果:1or0 exists查询:先执行外查询或子查询,某一个字段的值再根据结果过滤子查询涉及到了主查询的字段 案例#查询有员工的部门名......
  • MySQL_子查询_from后面的子查询 的使用
    将子查询结果充当一张表,要求必须起别名#查询每个部门的平均工资的工资等级#第一步:SELECTAVG(salary),department_idFROMemployeesGROUPBYdepartment_idSELECT......
  • MySQL_子查询
    含义出现在其他语句中的select语句,称为子查询或内查询外部查询语句,称为主查询或外查询 分类按子查询出现的位置Select后面   仅仅标量子查询From后......
  • Mysql InnoDB Redo log
    一丶什么是redoinnodb是以也为单位来管理存储空间的,增删改查的本质都是在访问页面,在innodb真正访问页面之前,需要将其加载到内存中的bufferpool中之后才可以访问,但是在聊......
  • 宝塔面板上docker配置mysql主从复制(手把手教程)
    链接:https://www.pudn.com/news/632ae4752aaf6043c9a3c611.html查看镜像是否拉取成功dockerimages借助镜像创建两个mysql容器(注:要放行端口,我这里是3339和3340)doc......
  • 一次mysql源码安装
    一次mysql源码安装需要准备的条件cmakegccboost1.59.0这里贴出我对应的依赖版本mysql版本对应的依赖boost版本必须要匹配,编译过程如果有报错信息boost要......