mysql索引

2023-10-29

为什么要使用索引

1.可以加快数据的检索速度(大大减少检索的数据量,这也是使用索引的主要原因)。
2.帮助服务器避免排序和临时表
3.将随机IO变为顺序IO

使用索引要注意的事项

1.在经常需要搜索的列上创建,可以加快搜索速度。
2.在经常使用where子句中的列上面创建,加快条件的判断速度。
3.在经常需要排序的列上面创建,因为索引已经排序,这样可以直接使用索引的排序,加快排序查询时间。
4.对于中到大型表创建索引都是非常有效的,但对于超大型表创建索引成本较大,不建议使用。
5.在经常用在连接的列上创建索引,这些列一般都是外键,可以加快连接速度。
6.避免在where字句中对字段施加函数,这样会造成无法命中索引。
7.在使用innodb时使用与业务无关的自增主键作为主键,即逻辑主键,而不要使用业务主键。
8.最好将需要设置主键的列设置为NOT NULL,因为null需要更多的储存空间,而且某些运算null不能参与。
9.删除长期不使用的索引,不使用的索引会消耗不必要的性能,Mysql5.7可以通过查询sys库的chema_unused_indexes视图来查询长期未使用的索引。

mysql索引主要使用的两种数据结构

哈希索引
1.对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余场景建议使用BTree索引。
注:innodb不支持哈希索引
BTree索引

MyISAM与Innodb实现BTree索引的区别
MyISAM
1.B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址来读取相应的数据记录,这叫“非聚簇索引”。
Innodb
1.其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按照B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此Innodb表数据文件本身就是主索引。这被称为聚簇索引(或聚集索引),而其余索引都作为辅助索引,辅助索引的data域储存相应记录的主键值而不是地址值,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。因此设计表时不建议使用过长的字段作为主键,也不建议只用非单调的字段作为主键,这样会造成主索引频繁分裂。

覆盖索引
什么是覆盖索引
如果一个索引包含或者覆盖所有需要查询字段的值,那我们就称之为"覆盖索引",我们知道Innodb储存引擎中,如果不是主键索引,叶子节点储存的是主键+列值。最终还是要"回表",也就是要通过主键再查找一次。这样就会比较慢,覆盖索引就是把要查询出的列和索引是对应的,不做回表操作。
覆盖索引的使用
如创建一个索引(name,age),执行以下sql语句:
select name , age from tablename where name = ‘java’ and age = 20;
在查询时要查询的列在叶子节点都存在,所以不用做回表操作。

选择索引和编写应依照索引查询的三个原则
1.单行访问是很慢的。特别实在机械硬盘储存中(SSD的随机I/O要快很多,不过这一点仍然成立)。如果服务器读取一个数据块只是为了获取其中一行,那么就浪费了很多工作。最好读取的块中能包含尽可能多所需要的数据行。使用索引就可以创建位置引,用以提升效率。
2.顺序访问范围数据是很快的,这有两个原因,第一:顺序I/O不需要多次磁盘寻道,所以要比随机I/O快很多(特别是对机械硬盘),第二:如果服务器能够按需要顺序读取数据,那就不需要额外的排序操作,并且groupby查询也无需再做排序和将行按组进行聚合计算了。
3.覆盖索引查询是很快的。如果一个索引包含了查询需要的所有列,那么存储引擎就不需要再做回表查找行了。这样避免了大量的单行访问,上面第一条已经写明了单行访问是很慢的。
关于索引补充
最左前缀
mysql中可以以一定顺序引用多列,这种索引叫做联合索引,如User表中name与age,加联合索引就是(name,age),而最左前缀索引指的是,如果查询时查询条件精确的匹配索引左边的一列或连续几列,则此列就可以被用到,如下:
select * from user where name = ‘java’ and age = 20 ; //可以命中索引
select * from user where name = ‘java’; //可以命中索引
select * from user where age = 20; //不可以命中索引
这里需要注意的是如果查询时两个索引条件都用上了,但顺序不同,查询引擎会自动优化为匹配联合索引的顺序,是可以命中索引的。
由于最左前缀索引的原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重后的个数,较多的放前面,order by字句也遵循此原则。

注意避免冗余索引
冗余索引指的是索引功能相同,能够命中就肯定能命中,那么就是冗余索引,如(name,age)和name这两个索引就是冗余索引,能够命中后者的查询肯定能命中前者,在大多数情况下都应该扩展已有的索引而不是重新创建索引。
通过sql语句为表字段创建索引

1.主键索引(PRIMARY KEY):
alter table ‘tablename’ primary key (‘column’);

2.唯一索引(UNIQUE):
alter table ‘tablename’ unique (‘column’);

3.普通索引(INDEX):
alter table ‘tablename’ index (‘column’);

4.全文索引 (FULLTEXT):
alter table ‘tablename’ fulltext (‘column’);

5.多列索引:
alter talbe ‘tablename’ index (‘column1’,‘column2’,‘column3’);

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

mysql索引 的相关文章

  • MySQL 5左连接未知列

    我有以下查询在 mysql 4 1 中工作 但在 5 0 中不起作用 SELECT FROM email e event email ee LEFT JOIN member m on m email e email WHERE ee ema
  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • 如何使用 PHP 从 MySQL 查询中按升序对值进行排序?

    我使用以下 PHP 脚本从 MySQL 表中获取和更改数据 并将结果打印在 HTML 表中 我希望按升序对数据进行排序 utilization percentage变量 它是由创建的 total client time total avai
  • Spark SQL/Hive 查询通过 Join 永远持续下去

    所以我正在做一些应该很简单的事情 但显然它不在 Spark SQL 中 如果我在 MySQL 中运行以下查询 查询将在不到一秒的时间内完成 SELECT ua address id FROM user u inner join user a
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • 本地数据库缓存的最佳实践?

    我正在开发一个应用程序 该应用程序的部分内容依赖于 MySQL 数据库 在某些情况下 应用程序将在互联网连接 UMTS 有限的环境中运行 特别是延迟较高的环境 应用程序的用户能够登录 并且应用程序用户界面的大部分内容都是从 MySQL 数据
  • 基本表创建 fpdf

    我找不到使用 fpdf 制作表格并从 mysql 数据库获取数据的合适教程 我只是想知道如何创建一个 我在网上尝试示例时遇到了很多错误 例如 我有 名字 中间名 姓氏 年龄 和 电子邮件 列 如何使用 fpdf 创建表格并回显数据库中的条目
  • Laravel Sum 列数据库 Eloquent

    尝试获取我的一个表中 int 字段的总和应该非常容易 不幸的是 事实并非如此 因为无论我使用 Laravel MySQL 还是 Excel 我都会得到不同的结果 Laravel 5 4 给了我20506 Table sum field na
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • 在 PHP 中将十进制/双精度/浮点值与 PDO 绑定的最佳方法是什么?

    看来类常量只涵盖PDO PARAM BOOL PDO PARAM INT and PDO PARAM STR用于绑定 您只是将十进制 浮点 双精度值绑定为字符串还是有更好的方法来处理它们 MySQLi 允许使用 d 类型表示 double
  • #1045 - 用户“root”@“localhost”的访问被拒绝(使用密码:YES)

    这可能看起来多余 但我无法找到正确的解决方案 我无法使用 mysql 控制台登录 mysql 它要求输入密码 但我不知道我实际输入的内容 有办法获取密码或更改密码吗 这就是我的 config inc 的样子 当我尝试打开 phpmyadmi
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe
  • MySQL 中的 UDF 性能

    我注意到 当查询在 SELECT 或 WHERE 子句中调用 UDF 时 MySQL 查询执行时间的性能会呈指数级下降 有问题的 UDF 查询本地表以返回标量值 因此它们不仅执行算术表达式 而且充当相关子查询 我通过简单地删除 UDF 并使
  • MYSql 前 10 名及其他总计

    我的查询运行良好 但我只需要前 10 个供应商 然后我需要将所有剩余的总计放在 所有其他 行中 如果没有单独的查询 我该如何做到这一点LIMIT 10 18446744073709551615 SELECT VENDOR fullname
  • MySql 从另一个表中减去一个表

    我有两个表 A 包含所有数据 表 B 从 A 中随机选择 25 的数据创建 所以 A 和 B 具有完全相同的列 也没有独特的列 我想做的是从 A 中减去 B 有什么想法吗 查看所有行A除了那些在B SELECT FROM A WHERE f
  • 错误代码 13,SELECT INTO OUTFILE 问题

    我试图了解使用 INTO OUTFILE 命令时不断遇到问题的原因 我总是收到这个错误 ERROR 1 HY000 Can t create write to file var www p1 txt Errcode 13 SELECT pa
  • MySQL 中非空值的计数和分组

    我需要计算按特定 ID 分组的非空 我的意思是至少包含 1 个字符的字符串 行 例如 我的数据可能如下所示 form id mapping 1 value 1 1 1 value 2 2 2 NULL 3 value 3 我想计算每个表单的
  • 创建rest api url以连接mysql数据库

    我想学习如何创建一个rest api url 以便我可以使用该url获取信息并将信息发布到我的mysql数据库中 谷歌搜索了很多并阅读了各种文章 但没有找到任何精确的内容可以学习 所有内容均以 about api 开头 以已创建的其余 ur
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp

随机推荐

  • STM32——SPI通信

    文章目录 SPI Serial Peripheral Interface 概述 SPI的硬件连接 SPI的特点和优势 SPI的常见应用 SPI的工作方式和时序图分析 工作模式 传输模式与时序分析 工作流程 SPI设备的寄存器结构和寄存器设置
  • c++自定义类对象的初始化_类装载器

    一 类的生命周期 类从被加载到虚拟机内存中开始 直到从内存中卸载为止 它的整个生命周期包括了 加载 验证 准备 解析 初始化 使用和卸载这7个阶段 其中 验证 准备和解析这三个部分统称为链接 linking graph LR A 加载 gt
  • RedHat linux 9.1/CentOS linux YUM在线安装用不了? 不会配置Linux的网络安装源?一分钟教你解决!!!

    一 配置本地源 1 新建cdrom目录 root kongd mkdir media cdrom 2 将本地光盘挂载至本地目录 media cdrom下 root kongd mount dev cdrom media cdrom 3 新建
  • Unable to find instance for XXXX

    当你的控制台报了这样的错误 这就是请求的后端服务没启动 联系后端启动后端就行
  • dubbo之RpcContext

    dubbo之RpcContext RpcContext 是一个 ThreadLocal 的临时状态记录器 当接收到 RPC 请求 或发起 RPC 请求时 RpcContext 的状态都会变化 比如 A 调 B B 再调 C 则 B 机器上
  • matlab 判断数组中的元素是否存在,C语言判断数组中是否包含某个元素

    在实际开发中 经常需要查询数组中的元素 例如 学校为每位同学分配了一个唯一的编号 现在有一个数组 保存了实验班所有同学的编号信息 如果有家长想知道他的孩子是否进入了实验班 只要提供孩子的编号就可以 如果编号和数组中的某个元素相等 就进入了实
  • ODTK:来自NVIDIA的旋转框物体检测工具箱

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 Jonathan Howe James Skinner 编译 ronghuaiyang 导读 旋转框相比矩形框可以更好的拟合物体 同时标注起来比分割要方便的多 使用来自NVIDI
  • k8s的初始及搭建

    kubernetes k8s 1 初识k8s 1 1 k8s是什么 kubernetes 简称K8s 是用8代替8个字符 ubernete 而成的缩写 是一个开源的 由go语言开发 用于管理云平台中多个主机上的容器化的应用 Kubernet
  • ElasticSearch 搜索引擎

    简称es 是类似于mysql但是专注于搜索的一种数据库 在elastic stack中占据重要地位 倒排索引 我们的数据库都是正向索引 比如根据id查询数据 那么倒排索引是将关键字进行分词 然后将词条和id保存在一张表中 不同数据分词后有相
  • retval释疑

    为了让方法返回一个与 方法的物理HRESULT 不相关的逻辑结果 COM IDL支持retval参数属性 retval属性的含义是 相关联的物理方法参数实际上是操作的逻辑结果 在支持retval的环境中 该参数应该被映射为操作的结果 例如
  • MyCAT 通过Native for MySQL 连接TESTDB 提示:1184 (HY000): Invalid DataSource:0

    问题描述 Windows 安装MyCAT服务 启动MyCAT服务 通过Native for MySQL 连接TESTDB 提示如下错误信息 1184 HY000 Invalid DataSource 0 造成问题原因 没有给root用户授予
  • 聚类尝试-kmeans-step2聚类模型训练及结果可视化

    step1 https blog csdn net nikita zj article details 122342746https blog csdn net nikita zj article details 122342746 1 数
  • python基础知识总结

    1 python相关 发布时间比java要早 1999年应用在网站后端开发 2004年发布web框架Django 2 特点 解释性语言 交互式语言 面向对象 跨平台 3 优点 易学 易读 易维护 有广泛标准库 互动模式 可嵌入性 嵌入C或者
  • 如何解决openstack中协程切换后request_id打印不对或者不打印的问题的

    OpenStack各组件一般都对外提供REST服务 当某个API请求过来之后 由于可能会涉及多个方法和进程的处理 为了方便的跟踪这个请求和后续通过日志定位 我们需要有个唯一标示来追踪这个请求 这样就能从大量日志信息中找到和这个请求相关的日志
  • Android开发之蓝牙(一)——基于SPP协议蓝牙模块通信

    使用设备 基本概念 基本流程 本文意在介绍蓝牙开发的主要流程 学习使用蓝牙开发一个星期了 写写一个星期以来遇到的一些小问题 还有介绍下流程 开发具有基本的通信功能 本项目主要是用于与蓝牙模块的串口读写功能 下一篇文章还有Android开发之
  • Java实现记忆化搜索

    记忆化搜索 是在使用递归搜索或者类似的情况下 使用一般的递归或许需要太多的时间与内存 这时我们就可以使用记忆化搜索 其本质为在递归搜索中 如果遇到了没有搜索过的 进行搜索并在内存中记录结果 如果之前搜索过 就直接调用结果 题目描述 对于一个
  • iPhone和ipad连接【华北理工大学】校园网快捷指令教程

    该教程仅适用于华北理工大学校园网 1 下载快捷指令 https www icloud com shortcuts 557cc9bf52b9474baae949773049cca3 用浏览器打开上面的链接 如果在QQ中打开的话 下载完了之后在
  • 自动化测试碰到比较难解决的问题是什么?如果出现这些问题给出你的解决方案?

    问题 自动化测试碰到比较难解决的问题是什么 如果出现这些问题给出你的解决方案 回答 比较难以解决的问题是 1 自动化测试没有达到预期目标 既没有节约人力 也没有提高产品质量 自动化测试脚本会频繁报错 但错误原因多半是脚本问题而不是产品质量问
  • C语言练习题(13)如果 x=2014 ,下面函数的返回值是( )A: 20 B: 21 C: 23 D 25(非常详细的讲解)

    1 如果 x 2014 下面函数的返回值是 int fun unsigned int x int n 0 while x 1 n x x x 1 return n A 20 B 21 C 23 D 25 解析 C 2014对应的二进制为 0
  • mysql索引

    为什么要使用索引 1 可以加快数据的检索速度 大大减少检索的数据量 这也是使用索引的主要原因 2 帮助服务器避免排序和临时表 3 将随机IO变为顺序IO 使用索引要注意的事项 1 在经常需要搜索的列上创建 可以加快搜索速度 2 在经常使用w