MySQL索引——总结篇
MySQL索引
数据库的三范式,反模式
数据库范式是为了解决关系数据库中数据冗余、更新异常、插入异常、删除异常等问题而引入的。数据范式可以避免数据冗余、节省空间、增加维护便利性
第一范式(原子性)
强调属性的原子性,要求属性不可再分解第二范式(唯一约束性)
强调记录的唯一约束性,表中必须有一主键,且非主键不能只依赖主键的一部分第三范式(冗余性约束)
强调属性的冗余性约束,非主键列必须直接依赖于主键反模式
范式设计下,数据库业务设计的表可能增多,涉及到多表联合查询,导致性能变差。因此,出于性能优先的考量,在数据库结构中使用反模式的设计,利用空间换取时间,采用数据冗余的方式避免多表联合查询。数据一致性的问题,可选择尽可能使数据达到用户一致,保证系统一段时间的自我恢复和修正,最终达成一致。
零碎知识
- 数据类型
数值、日期、字符串
- 可变长度类型数据
可变长度类型中varchar(200)与varchar(50)存储hello所占空间相同,但前者在排序时会占用更多内存
- 自增id删除之后的记录
InnoDB引擎只将当前自增主键的最大id存到内存中,重启后可能会使最大id丢失;而MyISAM会将最大id记录到数据文件中
- count 语句的统计
没有where限定时,InnoDB的count(*)相对MyISM可能慢很多,因为InnoDB是实时统计。而MyISM维护了一个计数器
索引
- 优缺点
优点:
提高检索速度,降低IO成本
事前排序,降低查询时CPU消耗
缺点:
增加存储空间、降低表更新速度
使用场景
小型表不建议使用,适用于中大型表;对特大型表索引的代价更大,可对数据库表进行分区索引的六种类型
普通索引、唯一索引(唯一性)、主键索引(不允许为空)、复合索引、外建索引、全文索引索引创建原则
出现在where语句后,而不是select;索引基数越大,效果越好;有时复合索引提高效率;过多索引会占用磁盘空间;主键尽量选取较短的数据类型;字符串索引应建立一个前缀长度,节省索引空间。索引使用注意事项
避免在where后面使用逻辑或表达式操作、使用OR连接条件
索引原理
默认使用B Tree索引
B Tree索引
以M路BTree结构为例(M>=2,否则为空树)
- 排序方式:所有节点都递增排序
- 子节点数:1<非叶子节点数<=M
- 关键字数:ceil(M/2)-1 < 关键字数 < M-1
- 叶子节点:所有子节点均在同一层,包换关键字及关键字记录的地址(此外,也有指向其子节点的指针,值为null)
B+Tree索引
对B Tree索引的一种优化,B+Tree中所有数据记录节点都按照键值大小顺序存放在同一层节点上,每个非叶子节点都只存储key值信息,这样可大大增加每个节点存储的key值数量,降低树的高度
- 非叶子节点只记录键信息
- 所有叶子节点之间都有一个链指针
- 数据记录都放在叶子节点中
B Tree 与 B+Tree的比较
- B+树层级更少:B+树每个非叶子节点存储的关键字更多,所以层级更少,查询速度更快
- B+树查询更稳定:B+树所有关键字地址都存储在叶子节点上,所以每次查找次数相同,查询速度更稳定
- B+树具有天然的排序功能:B+树所有叶子节点数据构成了一个有序链表,在查询区间数据时更方便,数据紧密性高,缓存命中率也高
- B+树全局遍历更快:B+树只需要遍历所有叶子节点,而不需要像B树一层层进行遍历
- B数对根节点附近的数据访问速度更快:因为B数非叶子节点本身存有关键字其数据地址
聚集索引和辅助索引
聚集索引(主键索引),其叶子节点存储的数据是整行的具体数据;
辅助索引(二级索引),其叶子节点存的是整行数据对应的主键值,根据辅助索引查询数据要经过两步,即回表:
- InnoDB 存储引擎会遍历辅助索引找到主键
- 再通过主键在聚集索引中找到完整的行记录数据
- 聚集索引的主键
- 定义主键时,InnoDB 存储引擎会将其当做聚集索引
- 没有定义主键时,InnoDB 存储引擎会定位到第一个唯一索引,且改索引的所有列值均为非空,将其当做聚集索引
- 没有主键且没有适合的唯一索引,InnoDB 存储引擎产生一个ID值6字节的聚集索引
聚集索引的注意事项
- 插入速度严重依赖插入顺序,按照主键的顺序插入是最快的方式,否则出现页分裂 会影响性能。(因此,一般定义一个自增的Id作为主键)
- 更新主键会导致更新的行移动,因此一般定义主键为不可更新
- 二级索引访问需要两次查询,第一次找到主键值,第二次找到行数据。(但是当查询数据只有id和索引时,可一次查询直接返回数据,即索引覆盖)
- 主键id建议使用整型。如此,主键索引的B+树节点可以存储更多主键id,辅佐索引的B+树节点可以存储更多主键id
索引的最左匹配特征
当索引种类是复合索引时,B+树通过从左往右建立搜索树,即索引的最左匹配特征
MySQL索引——总结篇的更多相关文章
- 初识mysql索引 - 小白篇
:接触mysq也有两年左右的时间了,但是对该数据库的理解自认还比较初级,看过很多文章,也看过一些相关的书籍,依然小白....(这里个人总结是两点主要原因:1.对mysql的学习大部分都是源于看一些杂七 ...
- Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...
- Mysql索引(一篇就够le)
我想很多人对mysql的认知可能就是CRUD(代表创建(Create).更新(Update).读取(Retrieve)和删除(Delete)操作),也不敢说自己会用和熟悉mysql,当然我就是其中一个 ...
- 「 MySQL高级篇 」MySQL索引原理,设计原则
大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...
- 「MySQL高级篇」MySQL索引原理,设计原则
大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...
- mysql 索引篇
一.索引优化 索引优化主要还是依赖explain命令,关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分r ...
- MySQL索引优化看这篇文章就够了!
阅读本文大概需要 5 分钟. 来源:cnblogs.com/songwenjie/p/9410009.html 本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引 ...
- MySQL 第五篇:索引原理与慢查询优化
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...
- 讲真,MySQL索引优化看这篇文章就够了
本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引背后的数据结构三部分相关内容,下面一一展开. 一.MySQL——索引基础 首先,我们将从索引基础开始介绍一下什么 ...
随机推荐
- 深入理解JVM(③)低延迟的Shenandoah收集器
前言 Shenandoah作为第一款不由Oracle(包括一起的Sun)公司的虚拟机团队所领导开发的HotSpot垃圾收集器.是只存在于OpenJDK当中的,最初由RedHat公司创建的,在2014年 ...
- 代码规范与计划(Beta阶段)
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 团队名称 WeChair 这个作业要求在哪里 Beta冲刺 这个作业的目标 代码规范与计划 作业正文 如下 其他参考文献 代码规 ...
- jquery-form详解
jQuery-Form 概观 jQuery表单插件允许您轻松而不显眼地升级HTML表单以使用AJAX.主要方法ajaxForm和ajaxSubmit从表单元素收集信息以确定如何管理提交过程.这两种方法 ...
- 谈谈 Promise 以及实现 Fetch 的思路
Promise 是异步编程的一种解决方案. Promise /** * 属性 */ Promise.length Promise.prototype /** * 方法 */ Promise.all(i ...
- Python3-collections模块-容器数据类型
Python3中的collections模块实现了一些专业的容器数据类型 最常用的容器数据类型 字典.列表和元组.集合都已经被Python默认导入,但在实现一些特定的业务时,collections模块 ...
- CCNA-Part3 - 数据链路层的趣事 - 走进交换机
在这篇文章中,会先介绍局域网及其的组件,通过交换机延伸到 TCP/IP 中数据链路层,了解数据的传输介质,以及交换机的发展历程及原理. 最后介绍数据帧的格式. 在阅读后应该了解如下的内容: 什么是局域 ...
- Digix2019华为算法精英挑战赛代码
Digix2019华为算法精英挑战赛代码 最终成绩: 决赛第九 问题 根据手机型号,颜色,用户偏好,手机APP等信息预测用户年龄. https://developer.huawei.com/consu ...
- Navicat15安装激活版教程
navicat15安装 一键式安装,安装包如下 链接:https://pan.baidu.com/s/1VTJmJ7ulUySWoWBu-fugiw 提取码:fz5u 先安装软件包点击安装,一直下一步 ...
- 造轮子-AgileConfig基于.NetCore的一个轻量级配置中心
微服务确实是行业的一个趋势,我自己也在把一些项目往微服务架构迁移.玩微服务架构配置中心是一个绕不过去的东西,有很多大牌的可以选,比如spring-cloud-config,apoll,disconf等 ...
- JavaScript基础尽量少使用全局变量(001)
Pattern意思是模式,好的编码习惯经过多次实践的应用就会形成模式,而反模式(Anti-Pattern)则是不好的编码习惯.了解 JavaScript模式之前,先来看看Anti-pattern的例子 ...