首页 > 数据库 >MySQL索引

MySQL索引

时间:2023-07-16 14:11:35浏览次数:49  
标签:name age 索引 MySQL where 主键

主键索引和普通索引结构上的区别

每一个索引在InnoDB里面对应一棵B+树。
有一个主键列为ID的表,表中有字段k,在k上有索引。
CREATE TABLE T (
    id int PRIMARY KEY,
    k int NOT NULL,
    name varchar(16),
    INDEX(k)
) ENGINE = InnoDB;
表中R1~R5的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6)。

InnoDB中主键索引也称为聚簇索引,主键索引的叶子节点存的是整行数据。

InnoDB中非主键索引也称为二级索引,非主键索引的叶子节点内容是主键的值。

如果非主键索引无法涵盖查询字段,那么就需要通过主键回表查询主键索引。索引可以覆盖查询字段时称为覆盖索引。

自增主键优势

NOT NULL PRIMARY KEY AUTO_INCREMENT
插入新记录时,系统会获取当前ID最大值加1作为新记录的ID值。
从性能角度来说,插入新记录不涉及其他记录的移动,不触发叶子节点的分裂。
从存储角度来说,主键长度越小,普通索引的叶子节点就越小。

为什么MySQL使用B+树?

树的高度会影响磁盘IO次数。
为什么不用二叉搜索树?
如果数据是顺序的,那么二叉树会变成链表样式,查找速度慢。
为什么不用红黑树?
红黑树一个节点只能存储一个数据,存储大量数据场景,红黑树高度大,查找速度慢。
为什么不用B树?
B+树在查找数据方面比B树更方便。
1. B+树的非叶子节点存储索引值,不存储数据行,叶子节点存储数据行。B树节点存储数据行,B+树比B树高度低。
2. 在范围查找时,B+树叶子节点采用双向链表,比B树快。

前缀索引

B+树可以利用索引的最左前缀来定位记录。
联合索引(name,age)

索引项是按照索引定义里面出现的字段顺序排序的。
当查询名字是张三的人时,快速定位到ID4,向后遍历得到结果。
当查询名字第一个字是张的人即where name like ‘张%’,快速定位到ID3,然后向后遍历,直到不满足条件为止。
最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。
使用联合索引时,考虑索引数量和成本。

索引下推

以市民表的联合索引(name, age)为例,检索出表中名字第一个字是张且年龄是10岁的所有男孩的SQL是
select * from tuser where name like '张%' and age=10 and ismale=1;
根据最左前缀原则,只能用 “张”,找到第一个满足条件的记录ID3,比全表扫描好。
MySQL 5.6之前,只能从ID3开始一个个回表,到主键索引上找出数据行,再对比字段值。MySQL 5.6引入的索引下推优化,在索引遍历过程中,对非主键索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

每一个虚线箭头表示回表一次。
无索引下推执行流程(回表4次)

索引下推执行流程(回表2次)

索引失效的情况

以%开头的like语句执行前导模糊匹配
select * from order where name like '%XX'


or语句前后没有同时使用索引
数据类型出现隐式强制转换
例如,varchar值不加单引号时可能会自动转换成int
select * from user where phone=13800001234
强制类型转换会导致全表扫描


负向条件查询
select * from order where status != 0 and stauts != 1


字段上执行函数计算
select * from order where YEAR(date) < = '2017'


可优化为值计算
select * from order where date < = CURDATE()
或者
select * from order where date < = '2017-01-01'


违反最左前缀匹配
idx_age_name(age, name)
select * from user where name = ‘王五’


范围查询时右侧的列不能使用索引
idx name_age_phoneNumber(name, age, phone_number)
where name = ‘王五’and age > 17 and phone_number = ‘13888888888’

查询行数

COUNT(*)和COUNT(1)没有区别,统计所有,性能差不多,推荐使用COUNT(*);COUNT(列名)不统计该列是NULL的。

在MySQL 5.7.18之前,通过扫描主键来处理COUNT(*)。
在MySQL 5.7.18后,通过扫描最小的二级索引来处理COUNT(*)。如果不存在二级索引,那么扫描聚簇索引。二级索引比主键索引小。

索引对insert、update和delete的影响

insert

不会用到索引,维护索引会耗时。

update

使用基于区分度较高的字段加的索引,更新更快。
使用基于区分度较低的字段加的索引,更新其他字段时有无索引区别不大,更新这个字段时更新更慢。

delete

删除的条件上用到索引更新更快。

参考资料

MySQL 实战 45 讲

标签:name,age,索引,MySQL,where,主键
From: https://www.cnblogs.com/WJQ2017/p/17557811.html

相关文章

  • MySQL自增值
    InnoDB引擎1自增值的保存机制MySQL5.7及之前的版本自增值保存在了内存里面,MySQL8.0版本才有自增值持久化能力(把自增值的变更记录在了redolog,重启后依靠redolog回复)。每次重启后,把自增值的最大值max(id)+1作为这个表当前的自增值。例如,一个表最大的id是10,AUTO_INCREMENT=11,删......
  • mysql主从复制
    1.MySQL主从复制介绍  主从复制实现的原理:(同步二进制日志文件)  主服务器开启二进制日志功能,当mysql进行操作同时生成一条操作事件日志,  并写入二进制日志文件中,从服务器通过同步二进制日志文件,并在从服务器  重新执行该事件,从而实现主从复制。2.主从服务器配置 ......
  • docker yum mysql
    Docker容器中使用Yum安装MySQL概述Docker是一个流行的容器化平台,它允许我们在独立、可移植的容器中运行应用程序。Yum(YellowdogUpdaterModified)是RedHatLinux和CentOS操作系统中的一个软件包管理器,它可以方便地用于安装、更新和删除软件包。本文将介绍如何在Docker容器中使用......
  • MySQL8 Bug 记录
    配置相关MySQL8安全插件更新导致的兼容性问题mysql8提供了新的功能,这些功能会影响用户创建或更新用户密码,以及使用那些仅支持mysql5登陆方式的客户端工具PasswordValidationOptionsandVariablesAuthenticationPlugins密码验证组件该组件要求用户必须设置符合一定......
  • 索引项的“全部”标记
    问题:标记索引项时,使用【标记全部】功能,但实际却没有“全部”被标记。如下图中有四个“视频”,【标记全部】以后只标记了第一个“视频”。解决:文字设计使然。【标记全部】是指不同段落中出现相同索引项是自动标记上,而同一段落内的不再重复标记。如下图中的“文档”,【标记全部......
  • JAVA面试题----MYSQL
     MYSQL。          mysql使用的引擎是InnoDB,它有四大特性:1插入缓冲2二次写3自适应hash索引(ahi),就不用走B+树了;4预读。使用InnoDB因为它是事务安全的存储引擎,它具备提交,回滚以及崩溃恢复的功能以及保护用户数据。MYSQL的索引分类:1主键索引2,唯一索引3.复合索......
  • 深入理解MySQL数据库索引优化
    在现代应用程序中,数据库是至关重要的组成部分。MySQL作为一种常用的关系型数据库管理系统,索引是其性能优化的关键。本文将深入介绍MySQL数据库索引的概念、类型以及优化技巧,帮助读者更好地理解和利用索引提升数据库查询性能。1.什么是索引?索引是一种数据结构,用于快速定位和访问数......
  • 联合查询后,索引无效原因分析
    在一次项目中需要甲方提供视图给我们,甲方是通过union合并两个表格生成视图给我们,但在查询过程中发现加了主键条件后,没走索引,造成15分钟依据不能出来数据,后来在本地数据库新建两个表测试,合并生成视图后是可以走两个子表的索引,于是在本地按照甲方的表结构创建表并导入部分测......
  • 0.mysql基础sql
    常用的数据库sql语句,数据库相关的技术和理论是成体系的,从基础使用到数据库原理,到性能优化,海量数据处理,但不同的技术角色所需掌握的深度是不同的:如果你是一位普通系统软件开发人员掌握基本sql操作、数据库索引、存储结构等也够用如果你是一位高并发系统的架构设计与开发者,那海量......
  • 腾讯技术官编写的594页MySQL优化手册,竟意外冲上GitHub调优热榜
    前言:当下互联网时代,MySQL受热捧的程度不容置疑,位列全球最流行的开源数据库也当之无愧,它广泛应用的因由不仅是产品本身的优势,更重要的是有无数社区技术爱好者为其默默耕耘。近几年MySQL发展迅速,各分支在性能与架构方面优化都有所突破与发展;与此同时,互联网应用业务也更加复杂,更具有......