学习mysql,你必须要了解的 “ 索引 ” 基本知识
1、select * 对效率的影响
在我们平时的代码编写或面试题中,很多人都会疑惑:select * 到底合理吗?
如果说不合理,为什么?如果说合理,原因又是什么?
1)、阿里规范
在阿里java规范中是强制不允许使用select * 这种操作的。
下面分析一下为什么不允许这种操作。
1、增加查询分析器解析成本。
这里主要是考虑了多余字段带来的更多成本消耗。
假设一张表有10个字段,你只需要其中的三个字段做分析。若使用select *,分析器就需要解析这十个字段,且将这是个字段查询出来也会增加多余的网络消耗,且若数据库和应用程序不在同一台服务器上,这种网络消耗更加明显。
2、增减字段容易与 resultMap 配置不一致。
采用select * 这种方式时,若表结构发生了改变,很容易导致操作失败。
2)、其他缺点
1、会查询出一些不需要的字段。这些字段很可能没有索引,这样就杜绝了覆盖索引的可能性,而索引覆盖又是速度极快,效率极高,业界极为推荐的查询方式。
2、多余字段会增大数据传输时间。
3、大字段,例如很长的 varchar,blob,text。准确来说,长度超过 728 字节的时候,会把超出的数据放到另外一个地方,因此读取这条记录会增加一次 io 操作。
科普:覆盖索引
解读1: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
解读2:索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫 做覆盖索引。
1
2
3
2、索引的简单介绍
1)、索引简介
索引用于快速找出在某个列中有一特定值的行。不使用索引,必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,就能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。
2)、索引分类
索引分单列索引和组合索引。
①、单列索引(主键索引,唯一索引,普通索引)
单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
普通索引,这个是最基本的索引,
唯一索引,与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值
主键索引,不允许有空值,(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位)
②、组合索引
组合索引,即一个索引包含多个列。
如果你建立了 组合索引(a_b_c) 那么他实际包含的是3个索引 (a) (a,b)(a,b,c)
在使用查询的时候遵循组合索引的"最左前缀",下面我们来分析一下 什么是最左前缀:及索引where时的条件要按照建立索引的时候字段的排序方式
1、不按索引最左列开始查询.
(多列索引) 如index(‘a’, ‘b’, ‘b’)
查询时使用where ‘b’ = ‘b1’ ,此时不使用索引,
查询时使用where ’b‘ = ‘b1’ and ‘c’=‘c1’ ,此时也不能使用索引
2、查询中某个列有范围查询,则其右边的所有列都无法使用索引查询(多列查询)
where a= ‘a1’ and b like = ‘b%’ and c=’c’
查询时只会使用索引中的前两列,因为like是范围查询
3、不能跳过某个字段来进行查询,这样利用不到索引,比如我的sql 是
select * from table where a > ‘a1’ and b = ‘b1’ and c = c1;
那么这时候他使用不到组合索引.
因为我的索引是 (a, b, c),如果第一个字段出现了范围符号的查找,那么将不会用到索引,如果我是第二个或者第三个字段使用范围符号的查找,那么他会利用索引,利用的索引是(a).
因为上面说了建立组合索引(a, b, c), 会出现三个索引
③、聚集索引、非聚集索引
聚集(clustered)索引,也叫聚簇索引。
定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
一个表就像是我们以前用的新华字典,聚集索引就像是拼音目录,而每个字存放的页码就是我们的数据物理地址,而拼音目录对应的A-Z的字顺序,和新华字典实际存储的字的顺序A-Z也是一样的
非聚集(unclustered)索引。
定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。
3)、索引建立规范
索引建立的规范:
1:经常被搜索。2:经常排序。3:经常作为where条件。4:无大量重复值。5:不经常更新。6:经常作为order条件。
3、索引是不是越多越好
由于经常被问到这个问题,所以这里单独拉出来分析一下。
结论:不是
1、数据量小的表不需要建立索引,因为小的表即使建立索引也不会有大的用处,还会增加额外的索引开销。
2、不经常引用的列不要建立索引,因为不常用,即使建立了索引也没有多大意义。
3、经常频繁更新的列不要建立索引,数据变更需要维护索引,越多的索引代表更多的维护成本。
4、更多的索引也需要更多的存储空间。
5、重复值多的列不适合建立索引,例如sex字段,值只有男、女。这时建立索引就没有意义。
关注公众号:Java架构师联盟,每日更新技术好文,后台回复mysql更有惊喜相待
学习mysql,你必须要了解的 “ 索引 ” 基本知识的更多相关文章
- 重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化
重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化 一:Mysql原理与慢查询 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...
- 重新学习MySQL数据库4:Mysql索引实现原理
重新学习Mysql数据库4:Mysql索引实现原理 MySQL索引类型 (https://www.cnblogs.com/luyucheng/p/6289714.html) 一.简介 MySQL目前主 ...
- 10 | MySQL为什么有时候会选错索引? 学习记录
<MySQL实战45讲>10 | MySQL为什么有时候会选错索引? 学习记录http://naotu.baidu.com/file/e7c521276650e80fe24584bc9a6 ...
- 重新学习Mysql数据库4:Mysql索引实现原理和相关数据结构算法
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- Mysql学习笔记(四)聊聊数据库索引
小心情(可直接跳到分割线后) 今天心情好些了.一些浓的化不开的坏情绪,也渐渐的在晚上解决掉一个复杂的逻辑问题后,渐渐消散了. 今天中午去吃饭的时候,坤哥漫不经心的说:'我这么多年终于悟出了一个道理,人 ...
- mysql笔记02 创建高性能的索引
创建高性能的索引 1. 索引(在MySQL中也叫做"键(key)")是存储引擎用于快速找到记录的一种数据结构. 2. 索引可以包含一个或多个列的值.如果索引包含多个列,那么列的顺序 ...
- mysql的limit性能,数据库索引问题,dblog问题
mysql的limit性能,数据库索引问题,dblog问题,redis学习 继续学习. dblog实际上是把日志记录在另一个数据库里面. 问题1: 一张表定义了5个索引,但是sql语句中用到了3个有索 ...
- 学习MySQL(上)
具体实例 1.PHP 服务器组件 对于初学者建议使用集成的服务器组件,它已经包含了 PHP.Apache.Mysql 等服务,免去了开发人员将时间花费在繁琐的配置环境过程. Window 系统可以使用 ...
- 学习MySQL(下)
具体实例 22.MySQL ALTER命令 当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 1.如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使 ...
- 学习MySQL我们应该知道哪些东西?
随笔:小编由于年前一直在找工作,而年后找到工作后又一直在忙工作,所以也很少有时间给大家写点什么,总的来说呢,回顾一下之前面试的几次经历,也曾小小的总结了一下自己的不足,发现自己虽然一直在原有的公司(外 ...
随机推荐
- JDBC——使用JDBC连接MySQL数据库
在JDBC--什么是JDBC一文中我们已经介绍了JDBC的基本原理. 这篇文章我们聊聊如何使用JDBC连接MySQL数据库. 一.基本操作 首先我们需要一个数据库和一张表: CREATE DATABA ...
- Linux 安装指定jdk版本
操作步骤 卸载系统自带jdk版本 1.查看安装的jdk rpm -qa | grep java 2.卸载系统自带jdk rpm -e --nodeps 包名 下载jdk 当前最新版本下载地址:http ...
- class 类组件:
ES6 中的class 类组件: // class 关键字:确定一个类型student以类的概念存在 class student{ //构造函数 是默认自动执行 // 初始化 name age 属性 ...
- 暑假集训Day2 互不侵犯(状压dp)
这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...
- zabbix4.4安装
本安装操作系统为centos7.5. 安装前准备: 1.1 安装依赖包: yum -y install wget net-snmp-devel OpenIPMI-devel httpd openssl ...
- JDK8--05:方法引用和构造器引用
在上一篇文章中,说过JDK8中内置的函数时接口,为了方便使用,JDK8还提供了方法引用和构造器引用,来简化lambda的写法 1.方法引用 方法引用说明:lambda表达式中的方法已经在其他方法中已经 ...
- MFC文档视图中窗口切换 (2012-05-11 18:32:48)
在文档试图应用程序,有时需要在工作区切换试图,以下就是如何切换试图了 .创建要切换的视图类,同时把构造函数,Create函数改变为public .在需要切换试图的动作响应中,加入切换代码,一般是在CM ...
- LeetCode第29场双周赛题解
第一题 用一个新数组newSalary保存去掉最低和最高工资的工资列表,然后遍历newSalary,计算总和,除以元素个数,就得到了平均值. class Solution { public: doub ...
- 编译运行Zookeeper源码
GitHub地址: https://github.com/apache/zookeeper 最新版本的 zookeeper 已经使用了 maven 进行管理了.不再需要安装 Ant 下载完成之后.使用 ...
- 服务认证(JWT)
上一篇已经讲了微服务组件中的 路由网关(Zuul),但是未介绍服务认证相关,本章主要讲解基于Spring Security 与 JJWT 实现 JWT(JSON Web Token)为接口做授权处理… ...