MySql之索引

2023-05-16

索引

  • 1>什么是索引?
  • 2>MySql的查询方式
  • 3>索引的实现原理
  • 4>索引应用在什么情况下
  • 5>索引的创建、删除
  • 6>索引的常见失败情况
    • 第一种情况
      • 即使添加了索引也不走索引的原因
    • 第二种情况
    • 第三种情况
      • 什么是复合索引
    • 第四种情况
    • 第五种情况
  • 7>索引的分类

1>什么是索引?

索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
	一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。
索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。
	对于一本字典来说,查找某个汉字有两种方式:
		第一种方式:一页一页挨着找,直到找到为止,这种查找方式属于全字典扫描。
效率比较低。
		第二种方式:先通过目录(索引)去定位一个大概的位置,然后直接定位到这个
位置,做局域性扫描,缩小扫描的范围,快速的查找。这种查找方式属于通过
索引检索,效率较高。

2>MySql的查询方式

  • 第一种方式:全表扫描

  • 第二种方式:根据索引检索。

     注意:
     	在实际中,汉语字典前面的目录是排序的,按照a b c d e f....排序,
     为什么排序呢?因为只有排序了才会有区间查找这一说!(缩小扫描范围
     其实就是扫描某个区间罢了!)
     	在mysql数据库当中索引也是需要排序的,并且这个所以的排序和TreeSet
     数据结构相同。TreeSet(TreeMap)底层是一个自平衡的二叉树!在mysql
     当中索引是一个B-Tree数据结构。遵循左小右大原则存放。采用中序遍历方式遍历取数据。
    

3>索引的实现原理

假设有一张用户表t_user

id(PK)name每一行记录在硬盘上的物理存储编号
100zhangsan0x1111
120lisi0x222
99wangwu0x888
88zhaoliu0x999
101jack0x666
55lucky0x5555
130tom0x7777

在这里插入图片描述

  • 在任何数据库中主键都会自动添加索引对象,在mysql中,具有唯一性的字段也会自动添加索引。
  • 在任何数据库中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
  • 在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中。不管索引存储在哪里,索引在mysql当中都是一个树的形式存在。(自平衡二叉树:B-Tree)

4>索引应用在什么情况下

  • 条件1:数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)

  • 条件2:该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。

  • 条件3:该字段很少的DML(insert delete update)操作。(因为DML之后,索引需要重新排序。)

     建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。
     建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的。
    

5>索引的创建、删除

创建索引:

mysql> create index emp_ename_index on emp(ename);
//给emp表的ename字段添加索引,起名:emp_ename_index

删除索引:

mysql> drop index emp_ename_index on emp;
、、将emp表上的emp_ename_index索引对象删除。

怎么查看一个SQL语句是否使用了索引进行检索?

mysql> explain select * from emp where ename = 'KING';
//结果 type = ALL
//所以是全查找

6>索引的常见失败情况

第一种情况

select * from emp where ename like '%T';

即使添加了索引也不走索引的原因

原因是因为模糊匹配当中以“%”开头了!
		尽量避免模糊查询的时候以“%”开始。
		这是一种优化的手段/策略

第二种情况

	使用or的时候会失效,如果使用or那么要求or两边的条件字段都要有索引,才会走索引。
	所以这就是为什么不建议使用or的原因。

第三种情况

使用复合索引的时候,没有使用左侧的列查找,索引失效。
create index emp_job_sal_index on emp(job,sal);
		mysql> explain select * from emp where job = 'MANAGER';
		//查询job字段时可以正常使用索引
		mysql> explain select * from emp where sal = 800;
		//查询sal字段时捕索引失效

什么是复合索引

		两个字段,或者更多的字段联合起来添加一个索引,叫做复合索引。

第四种情况

在where当中索引列参加了运算,索引失效。

	mysql> create index emp_sal_index on emp(sal);
	mysql> explain select * from emp where sal+1 = 800;

第五种情况

在where当中索引列使用了函数

explain select * from emp where lower(ename) = 'smith';
//lower小写函数

7>索引的分类

索引是各种数据库进行优化的重要手段。优化的时候优先考虑的因素就是索引。

  • 单一索引:一个字段上添加索引。
  • 复合索引:两个字段或者更多的字段上添加索引。
  • 主键索引:主键上添加索引。
  • 唯一性索引:具有unique约束的字段上添加索引。

  • 注意:唯一性比较弱的字段上添加索引用处不大。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySql之索引 的相关文章

  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • 海量记录的bulk_create最佳实践

    I use bulk create将 1 mio 记录插入到新表中 需要 80 秒 Django 只使用一个 CPU 核心 大约 25 CPU 但没有一个核心达到 100 我相信有改进的潜力 这是代码 class Stock models
  • 连接 Netbeans 和 MySQL 但出现大整数错误

    所以我正在尝试向我的 Netbeans 数据库 即 MySQL 添加新连接 但我遇到了大整数转换错误 有人可以帮助我吗 详细地 我右键单击现有的MySQL 服务器位于 localhost 3306 root 已断开连接 gt gt 选择co
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • 合并两个 MYSQL SELECT 查询[重复]

    这个问题在这里已经有答案了 可能的重复 如何将两个 Post Category 表 MYSQL SELECT 查询合并为一个 https stackoverflow com questions 12972130 how to combine
  • 每月获取记录,但如果该月没有记录,则为零

    如果我有以下 SQL 表 Tests id type receiveDate 1 Blood 2012 01 18 2 Blood 2012 01 20 3 Blood 2012 01 18 4 Blood 2012 03 01 5 Blo
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • MySQL 错误 1172 - 结果包含多行

    在存储过程中运行查询时 我从 MySQL 收到此错误 错误代码 1172 结果包含多行 我理解错误 我正在做一个SELECT INTO var list 因此查询需要返回单行 当我使用LIMIT 1 or SELECT DISTINCT 错
  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 如何在 SEQUELIZE (nodeJS) 中创建触发器?

    我正在尝试使用sequelize 创建一个触发器 主要思想是创建一个实例CONFIG创建后USER USER MODEL module exports function sequelize DataTypes var User sequel
  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat

随机推荐

  • 用node实现一个postgresql操作定时器

    已知数据库 xff0c 我要用node js实现定时任务 xff0c 定时user表下的vip字段重置所有记录为0 首先 xff0c 你需要使用Node js中的node schedule模块来设置定时任务 你可以在你的项目中安装node
  • Vue获取网页微信登录二维码

    首先安装npm install vue wxlogin save dev lt template gt lt div id 61 34 app 34 gt lt div id 61 34 wxbox 34 gt lt wxlogin app
  • jeecg-boot配置字典遇到的问题

    在online报表生成代码后 xff0c 配置的数据字典一直不生效 xff0c 显示空值最后在官方文档发现需要后端加一个注解 xff0c 如下图所示 xff1a 文档链接 xff1a http doc jeecg com 1273944
  • 配置pycharm 编译器时遇到的一些问题

    今天在配置完pycharm 编译器运行代码时 xff0c 突然出现一个报错 Fatal Python error Py Initialize unable to load the file system codec ImportError
  • chrome浏览器起始页被hao123劫持了怎么办?

    对于一个强迫症来说 xff0c 起始页被修改了 xff0c 真的很难受 hao123真的很烦 第一种情况 修改了你浏览器的默认起始页 xff0c 在设置中去修改就可以了 第二种情况 在这里面添加了他的网站 xff0c 删除或者从新生成一个快
  • COMODO杀毒软件Linux版

    科摩多Linux杀毒软件 CAVL 提供同样出色的防病毒保护 xff0c 同时附带一个额外的完全可配置的反垃圾邮件系统 具有按访问和按需求病毒扫描 xff0c CAVL还采用了基于云计算的对未知文件的分析 xff0c 针对零日恶意软件提供了
  • ubuntu系统下安装windows并引导双系统

    首先 xff0c 感谢wenbusy xff0c 给了我很大的帮助 xff0c 以下部分内容来自于该博主 windows系统安装ubuntu很容易 xff0c 但在ubuntu下如何安装windows构成双系统并成功引导 xff1f 本文来
  • 3.4 小乌龟git使用说明

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 安装二 使用步骤1 设置语言2 添加你的git 用户名和邮箱3 创建git空项目3 1 方法1 本地创建3 2 方法2
  • WinScp连接Win7

    本机安装WinScp 目标Win7安装OpenSSH 下载openSSH https github com PowerShell Win32 OpenSSH releases下载后解压放在C xff1a ProgramFiles目录下设置环
  • DEBIAN_FRONTEND noninteractive参数

    DEBIAN FRONTEND这个环境变量 xff0c 告知操作系统应该从哪儿获得用户输入 如果设置为 noninteractive xff0c 你就可以直接运行命令 xff0c 而无需向用户请求输入 xff08 所有操作都是非交互式的 x
  • RFC3630 - TE Extensions to OSPF Version 2中文

    Traffic Engineering TE Extensions to OSPF Version 2 该标准是RFC2370的更新 标准RFC2370是关于OSPFv2的Opaque LSA的扩展 xff0c 在被更新以后 xff0c 已
  • 【分享】免梯子的chatGPT,玩 ChatGPT 的正确姿势

    火了一周的 ChatGPT xff0c HG 不允许还有小伙伴不知道这个东西是什么 xff1f 简单来说就是 xff0c 你可以让它扮演任何事物 xff0c 据说已经有人用它开始了颜色文学创作 因为它太火了 xff0c 所以 xff0c 本
  • 使用Unity3D Physics来工作

    这个教程将教你如何用Unity3D构建一个小球击倒柴火堆的游戏 xff01 在这个过程中 xff0c 你将了解到关于使用物理引擎的重要性和你这么做后可以减少无数小时的手工动画的时间 继续阅读 xff01 有什么完整的现代游戏引擎会缺少物理引
  • 不想学挖掘机的厨师不是好程序员!

    程序员大部分学历都不高 xff1f 我想是的 xff0c 因为刚开始只要你会敲代码 xff0c 就能挣到钱的 相比于其他行业 xff0c 程序员的工资还是受很多人认可的 xff0c 我就是其中的一员 但是我们想往高处爬 xff0c 显然没有
  • 关于X射线球管的参数

    球管的规格参数包括结构参数和电参数两种 前者指球管结构所决定的各种参数 xff0c 如靶面的倾斜角度 有效焦点 外形尺寸 重量 管壁的滤过当量 阳极转速 工作温度和冷却形式等 电参数是指球管电性能的规格数据 xff0c 如灯丝加热电压和电流
  • [DSA] 决定数字血管造影系统综合性能的关键参数研究

    一 购买数字血管造影系统的目的 xff1a 放射介入学的出现 xff0c 彻底改变了放射学在医学中的地位 xff0c 使放射学不仅能够诊断 xff0c 而且能够治疗 xff0c 并将诊断与治疗有机的结合起来 xff0c 它已渗透到了临床学科
  • 软件的生命周期(软件工程各阶段的工作)

    其实软件工程是一个非常大的概念 xff0c 我们的软件测试也好 xff0c 软件开发也好 xff0c 软件运维也好 xff0c 其实都是属于软件工程的范畴 今天就讲一讲软件工程和我们软件测试相关的一些内容 我们今天三个主要的节点 xff1a
  • 查看磁盘分区UUID的四种方法

    查看磁盘分区 UUID 的四种方法 xff08 Helloblock 写作 xff09 1 使用 dev disk by uuid 目录 root 64 server ls l dev disk by uuid 总用量 0 lrwxrwxr
  • Lodash 核心 lodash

    baseCreate Object create ptoto propertiesObject 不能以名称而去定义该方法的作用 它并不只是为了创建一个对象 其可以理解为 34 创建一个继承了指定对象的对象 34 并且创建后的对象是不存在原型
  • MySql之索引

    索引 1 gt 什么是索引 xff1f 2 gt MySql的查询方式3 gt 索引的实现原理4 gt 索引应用在什么情况下5 gt 索引的创建 删除6 gt 索引的常见失败情况第一种情况即使添加了索引也不走索引的原因 第二种情况第三种情况