高性能的Mysql读书笔记系列之五(创建高性能的索引)

2023-05-16

前言:

索引(在MySQl中也叫做“键(key)”)是存储引擎用于快速找到记录的一种数据结构。

索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时,性能则会急剧下降。

索引用于快速找出在某个列中有一特定值的行。不使用索引,Mysql必须从第一条记录开始读完整个表,直到找出相关的行,表越大查询数据所花费的时间就越多。如果表中查询的列有索引,MYSQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。

正文:

一、如何理解索引是如何工作的

要理解索引是如何工作的,最简单的方法就是去看看一本书的目录(索引)部分,如果想在一本书中找到某个特定主题,一般会先看书的“索引”,找打对应的页码,其实索引也是类似的原理。

二、索引的结构

1.B-Tree索引

 当人们谈论索引的时候,如果没有特别指明类型,那多半说的是B-Tree索引,它使用B-Tree数据结构来存储数据。大多数MySQL引擎都支持这种索引。

2.哈希索引

哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

3.空间数据索引(R-Tree)

MyISAM表支持空间索引,可以用作地理数据存储。和B-Tree索引不同,这类索引无须前缀查询。空间索引会从所有维度来索引数据。查询时,可以有效地使用任意维度来组合查询。必须使用MySQL的GIS相关函数如MBRCONTAINS()等来维护数据。MySQL的GIS支持并不完善,所以大部分人都不会使用这个特性。开源关系数据库系统中对GIS的解决方案做得比较好的是PostgreSQL的PostGIS。

4.全文索引

全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。全文搜索和其他几类索引的匹配方式完全不一样。它有许多需要注意的细节,如停用词、词干和复数、布尔搜索等。全文索引更类似于搜索引擎做的事情,而不是简单的WHERE条件匹配。
在相同的列上同时创建全文索引和基于值的B-Tree索引不会有冲突,全文索引适用于MATCH AGAINST操作,而不是普通的WHERE条件操作。

5.其他索引类别

还有很多第三方的存储引擎使用不同类型的数据结构来存储索引。例如TokuDB使用分形树索引(fractal tree index),这是一类较新开发的数据结构,既有B-Tree的很多优点,也避免了B-Tree的一些缺点。

三、索引的优点和缺点

优点:

1.索引大大减少了服务器需要扫描的数据量。

2.索引可以帮助服务器避免排序和临时表。

3.索引可以将随机I/O变为顺序I/O。

缺点:

1.实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。

2.虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

四、索引的分类

1.单例索引

  • 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值
  • 主键索引:是一种特殊的唯一索引,不允许有空值

2.组合索引

一个的索引包含多个列,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀。

3.全文索引

要求只有在MyISAM引擎上才能使用,只有在CHAR、VARCHAR、TEXT类型字段上使用全文索引。全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。

4.空间索引

空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。

五、如何创建和删除索引

1. 创建表的同时创建索引

create table student (
  id   bigint(20)  NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT  '主键',
  name  VARCHAR(32) NOT NULL COMMENT '姓名',
  email VARCHAR(64) NOT NULL COMMENT  '邮箱',
  message text DEFAULT  NULL COMMENT '个人信息',
  INDEX index_name (name) COMMENT '索引name'
) comment  = '学生表';

语法:

index  索引名 (字段名) 

2 .在存在的表上创建索引

alter table student add index index_name (name)

语法:

alter table 表名 add index 索引名 (列名)

3.创建组合索引

alter table student add index index_name_email(name,email)

语法:

alter table 表名 add index 索引名 (列名1,列名2)

4.删除索引

drop index index_name on student

语法:

drop index 索引名 on 表名

5.如何查看表的索引

show index from student

语法:

show index from 表名

总结:

今日的鸡汤:努力只能及格,拼命才会优秀。

我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有11660位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高性能的Mysql读书笔记系列之五(创建高性能的索引) 的相关文章

随机推荐

  • XShell 6连接linux,上传windows 文件到虚拟机,在Linux下安装Qt

    一 XShell 6通过SSH连接Liunx 1 下载XShell xff0c 并安装 xff1b 这里建议下载XShell破解版 2 查看windows的IP和LINUX的IP是否一样 1 xff09 虚拟机上点击 编辑 gt 虚拟网络编
  • Activity中onNewIntent()方法触发及注意事项

    Activity的onNewIntent 方法何时会被调用 前提 ActivityA已经启动过 处于当前应用的Activity堆栈中 当ActivityA的LaunchMode为SingleTop时 xff0c 如果ActivityA在栈顶
  • (原创)Android Studio解除SVN绑定

    配置了SVN的项目 xff0c 如果想要解除配置该如何做呢 xff1f 一般的处理方法 xff0c 是找到项目的地址 xff0c 把 SVN文件夹删除 但是这样还不够彻底 因为项目的文件名还是有svn配置后的颜色 xff0c 如下图 如何让
  • Ocelot网关使用IdentityServer4认证

    环境 xff1a window10 x64vs2022 企业版 17 0 0 NET 6 0IdentityServer4 AccessTokenValidation 3 0 1Ocelot 17 0 0 Ocelot是在 net core
  • 【记录】Ubuntu美化之Gnome桌面教程

    嘿嘿 xff0c 什么都不说了 xff0c 先上图 支持多个桌面同时运行 xff0c 界面简洁 图标美观 右下角的托盘也很可爱 第一步 xff1a 第一步当然是要安装gnome啦 GNOME已经包含在Ubuntu软件库中 您所要做的就是打开
  • python 中 机器学习算法 --决策树

    文章目录 思维脑图3 1 2 用pandas加载数据集3 1 3 清洗数据集现在计算这些的实际值主队和客队最后一场比赛赢了吗 xff1f 3 2 决策树3 2 1 决策树中的参数3 2 2 决策树的使用 3 3 体育赛事结果预测 3 4 随
  • 2021-11-01 福州高速公路定位测试有感

    室内定位测试大大小小经历了数十次 xff0c 这次福州的高速公路隧道测试感触颇多 第一 强大的自驱力 xff1a 从测试安排出差伊始 xff0c 团队成员主动提出听从安排 xff0c 积极配合 xff1b 讨论测试计划和方案时 xff0c
  • New Timeline的Toolbar样式设计

    最近在做新版的Timeline xff0c Toolbar Menu 的功能基本完成 xff0c 因此把截图拿出来与各位博友分享一下 新版Timeline HTML版本 主页面 xff1a 这次主要讲解一下Toolbar Menu 的功能
  • VS改大小写的快捷键

    改成小写 xff1a Ctrl 43 U 改成大写 xff1a Ctrl 43 Shift 43 U 记得要选中要修改的一段英文
  • SQL两表之间:根据一个表的字段更新另一个表的字段

    1 写法轻松 xff0c 更新效率高 xff1a update table1 set field1 61 table2 field1 field2 61 table2 field2 from table2 where table1 id 6
  • 多边形面积计算公式

    function polygonArea points var i j var area 61 0 for i 61 0 i lt points length i 43 43 j 61 i 43 1 points length area 4
  • table合并单元格colspan和rowspan

    span style font family none code span style background color rgb 255 255 0 span style font family none code span style f
  • jQuery两个稳定版本的比较

    jquery历经了多个版本的更新 xff0c 版本上的比较貌似没什么必要性 xff0c 一般来说新的版本会比旧的版本各方面都略有提升 xff0c 但由于新版中增加了各种新的功能 xff0c 难免会引起bug的发生 评估一个版本是否适合当前开
  • (原创)从addView讲到LayoutParams

    Android开发中 xff0c 有时候要动态添加布局 xff0c 这时候我们都会采用一个叫做addView的方法 xff0c 那么就先来讲一讲这个方法 addView是viewGroup中的的方法 xff0c 故而是用来给布局添加子控件用
  • 室内定位简介

    室内定位定义 xff1a 室内定位是指在室内环境中实现位置定位 xff0c 主要采用无线通讯 基站定位 惯导定位等多种技术集成形成一套室内位置定位体系 xff0c 从而实现人员 物体等在室内空间中的位置监控 室内定位需求 xff1a 在室外
  • 命令行提交代码到gitLab服务器

    1 创建项目 xff0c 前提是gitLab服务器已经搭建完成 xff0c 在gitLab个人账户下创建一个项目 xff0c 项目名称自己定义 xff0c 如图 xff1a 2 拷贝本地代码到指定目录 xff0c 一般自己创建一个固定的代码
  • VS 附加到进程调试技巧

    有些时候碰到自己开发的程序嵌入到别人的框架中 xff0c 而在接口的地方出了问题 xff0c 而又不方便将自己的模快加入到别人的工程中 有很多相关的文件 xff0c 还有mster页面等 xff0c 这个时候VS的附加到进程调试变得不可或缺
  • Request和Response详解

    Request 和 Response 对象起到了服务器与客户机之间的信息传递作用 Request 对象用于接收客户端浏览器提交的数据 xff0c 而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器 一 Request对象
  • 人最宝贵的东西是生命

    钢铁是怎样炼成的 人最宝贵的东西是生命 生命属于人只有一次 一个人的生命是应该这样度过的 当他回首往事的时候 他不会因虚度年华而悔恨 也不会因碌碌无为而羞耻 这样在临死的时候 他才能够说 39 我的生命和全部的经历 都献给世界上最壮丽的事业
  • 高性能的Mysql读书笔记系列之五(创建高性能的索引)

    前言 xff1a 索引 xff08 在MySQl中也叫做 键 xff08 key xff09 xff09 是存储引擎用于快速找到记录的一种数据结构 索引对于良好的性能非常关键 尤其是当表中的数据量越来越大时 xff0c 索引对性能的影响愈发