MYSQL进阶(2)

news2024/9/27 23:22:32

删除索引:drop Index indexName on tableName;

B树叶子结点和非叶子节点都存在数据,那么当数据量很大的时候,把索引加载起来就需要很长时间

联合索引:

1)定义:是给一张表上面的多个列增加索引,也就是说给表上面的多个列增加索引,供快速查询使用,当两个列的组合是唯一值时,联合索引是个不错的选择。

用简单例子带你了解联合索引查询原理及生效规则 - 知乎说的很好对于联合索引

Mysql系列-联合索引 - 知乎

2)​联合索引和单个索引对比来讲,联合索引的所有索引项都会出现在索引上,存储引擎会先根据第一个索引项排序,如果第一个索引项相同的话才会去看第二个,所有我们在查询的时候,如果头索引不带的话,联合索引就会失效,因为在根节点他就不知道怎么往下走

索引失效:

1)最左前缀法则:如果说我们使用了联合索引,那么要遵循最左前缀法则,最左前缀法则指的是从查询索引的最左列开始,并且不跳过索引中的列,如果说跳过某一列,那么直接会导致后面字段索引失效

1)注意:最左前缀法则指的是最左边的列,是在进行查询的时候,联合索引的最左边字段必须存在和我们前后所写的SQL顺序没有关系

2)就是当你比如说创建了一张表,这张表的所有字段都有索引,那么这个时候最左匹配不遵循,索引也不会失效,因为索引树里面已经包含了有关于查询的全部字段,此时就不需要进行回表查询了

3)况且如果说跳过了某一列,后面的索引字段全部失效

 select * from child;//查询表里面所有字段
+----+----------+----------+---------+--------+
| id | username | password | classID | salary |
+----+----------+----------+---------+--------+
|  1 | A        | 12345    |       1 |   1234 |
|  2 | B        | 8989     |       2 |     89 |
+----+----------+----------+---------+--------+
2 rows in set (0.00 sec)

mysql> create index AllIndex on child(username,password,classID);//针对表中的三列建立索引
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from child where username="A" and password="12345" and classID=1;//符合最左前缀法则,索引生效
+----+----------+----------+---------+--------+
| id | username | password | classID | salary |
+----+----------+----------+---------+--------+
|  1 | A        | 12345    |       1 |   1234 |
+----+----------+----------+---------+--------+


mysql> desc  select * from child where username="A" and password="12345" and classID=1;
//显示信息
+----+-------------+-------+------------+------+---------------+----------+---------+-------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key      | key_len | ref               | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-------------------+------+----------+-------+
|  1 | SIMPLE      | child | NULL       | ref  | AllIndex      | AllIndex | 311     | const,const,const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+----------+---------+-------------------+------+----------+-------+


mysql> select * from child where password="12345" and classID=1;
//不满足最左前缀法则,索引失效
+----+----------+----------+---------+--------+
| id | username | password | classID | salary |
+----+----------+----------+---------+--------+
|  1 | A        | 12345    |       1 |   1234 |
+----+----------+----------+---------+--------+


mysql> desc select * from child where password="12345" and classID=1;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | child | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |    50.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+

desc  select * from child where username="A" and classID=1;
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key      | key_len | ref   | rows | filtered | Extra                 |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-----------------------+
|  1 | SIMPLE      | child | NULL       | ref  | AllIndex      | AllIndex | 153     | const |    1 |    50.00 | Using index condition |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-----------------------+

2)在联合索引中,出现了范围查询,范围查询右侧的列索引失效,所以我们尽量少使用>,<而是使用>=和<=

3)在索引列上面进行运算操作,那么索引列会失效,也包括查询的列使用了函数

4)字符串类型的字段不加上引号,那么索引字段失效,或者说查询的列进行了隐式类型转换

5)如果是like尾部模糊查询,那么索引不会失效,但是如果头部模糊查询,那么索引会失效

6)or连接条件:如果说or前面的列有索引,但是后面的列没有索引,那么涉及到的索引都不会生效,只有当or两侧都有索引之后,索引才会生效

7)MYSQL评估如果说索引比全表扫描的更慢,那么直接会走全表扫描,索引也会失效

总结:

1)我们在实际进行开发的时候,避免使用select *,会特别容易出现回表查询,如果我们创建了联合索引,里面包含这个表中的所有字段,那么就会在这个联合索引里面就已经包含着所有我们需要进行查询的字段,就不需要再进行回表查询了,但是在一般情况下,联合索引不一定包含表中的所有字段,在我们进行查询联合索引的时候,发现着某一个字段在某一个联合索引中不存在,那么只能进行回表查询,在主键索引也就是聚簇索引中去查询完整的数据载荷了,所以我们要进行规避回表查询,性能就会降低

2)所以说在我们的执行计划里面:我们可以看到Extra字段,里面的值如果是Using where;Using index表示查找使用了索引,但是需要的数据都是可以在索引列中找到的,所以不需要进行回表查询

3)但是如果说Extra中出现了Using index condtion:表示使用了索引,但是需要进行回表查询数局

所以说使用联合索引检索效率比单列索引高,况且不容易出现回表查询

前缀索引:当我们需要针对字符串类型来进行创建索引的时候,索引的字符串就会变得很长很长,或者是打文本数据,查询时候会浪费大量的磁盘IO,影响查询效率,所以我们应该只将字符串的一部分前缀作为索引,这样可以大大节省索引空间

1)create index 索引名字 on 表名(哪一个列名(整数前缀))

2)咱们可以根据索引的选择性来进行确定,而选择性是根据不重复的索引值/数据库表中的记录总数的比值,索引选择性越高那么查询效率就越高,性能也是最好的

select count(*) from child;//先进行查询一共有多行
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.01 sec)

mysql> select count(distinct password) from child;//查询不重复密码有多少行
+--------------------------+
| count(distinct password) |
+--------------------------+
|                        2 |
+--------------------------+
select count(distinct substring(password,1,3))/count(*) from child;//查询截取后的字段除以总数据长度的值是不是1,如果截取的字段出现了重复,那么值会小于1
+--------------------------------------------------+
| count(distinct substring(password,1,3))/count(*) |
+--------------------------------------------------+
|                                           1.0000 |
+--------------------------------------------------+
create index passwordIndex on child(password(3));
 show index from child;
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name      | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| child |          0 | PRIMARY       |            1 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| child |          1 | AllIndex      |            1 | username    | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| child |          1 | AllIndex      |            2 | password    | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| child |          1 | AllIndex      |            3 | classID     | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| child |          1 | passwordIndex |            1 | password    | A         |           2 |        3 | NULL   | YES  | BTREE      |         |               |
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------

最后一列中的Sub_Part就是描述在原来的字符串里面截取了几个字段

上面我们就创建了一个前缀索引:对前五个字符构建前缀索引,并没有针对这个字段建立完整的索引

1)当我们进行查询select * from "17799999"的话,会进行截取前5个字符,根据字符先后顺序,进行比较,也就是根据26个字母的先后顺序,查到主键id,再根据主键id在聚簇索引上面查询到完整的数据载荷了,再从数据载荷里面查询到email的值,和刚才的from后面的值进行对比,相同的话返回完整的记录

2)然后那个前缀索引的叶子结点的指针继续向后走,重复刚才的过程

单列索引和联合索引的对比:

create table User(userID int,username varchar(40),password(40),classID int);

1)现在咱们在User表中针对username和password分别创建索引,也就是说现在有两个索引

先在进行操作select username,password from User where username=XXX and password=XXX

2)但是现在这样的查询效率是比较低的,但是最终MYSQL只会选择一个索引,所以还是要进行回表查询的

3)但是当我们针对这两个字段创建一个联合索引在继续执行上面的SQL语句,就会效率很高的

所以说在我们进行多条件联合查询的时候,就例如上面的例子,我们针对两个列分别建立了索引,又创建了联合索引,MYSQL就会进行自动评估哪一个字段的索引效率会更高,从而会进行选择合适的,效率高的索引来进行查询

覆盖索引:是select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。

总结:

1)索引可以分为:主键索引,唯一索引(如果说有某一个列的值不能重复),常规索引,全文索引,在InnoDB存储引擎里面,索引存储结构分为聚簇索引和费聚簇索引

2)索引使用的设计原则:

1)我们要针对数据量比较大,况且查询比较频繁的列建立索引

2)针对常用作查询条件where order by group by操作的字段进行建立索引

3)尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率就越高

4)如果是针对字符串类型的字段,字段的长度比较长,我们可以针对字段的特点,建立前缀索引

5)尽量使用联合索引,减少单列索引,查询的时候,联合索引可以覆盖索引,节省存储空间,提高查询效率

6)要控制索引数量,索引不是多多益善,索引越多,维护索引结果的代价也会越大,会影响增删改速率

7)如果说索引列不能存储null值,请在建表的时候用not null来进行约束,当优化器知道每列是否包含null值的时候,他就更好的确定使用哪一个索引更有效的进行查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB聚集分析

文章目录 聚集操作管道模式聚集MapReduce 聚集简单聚集函数小结聚集操作 聚集操作是对数据进行分析的有效手段。MongoDB 主要提供了三种对数据进行分析计算的方式:管道模式聚集分析、MapReduce聚集分析、简单函数和命令的聚集分析。 管道模式聚集 这里所说的管道类似于UNIX…

2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 思路及代码实现(持续更新中)

2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 思路及代码实现(持续更新中) 1 题目 全球变暖与否? 加拿大49.6C的高温为地球北纬50以上地区创造了新的气温记录&#xff0c;一周内就有数百人死于高温;美国加利福尼亚州死亡谷54.4C&#xff0c;是地球上有记录以来的最高温度;科…

Ubuntu 16.4虚拟机 配置Hadoop集群

Ubuntu 16.4 配置Hadoop集群总体步骤环境说明虚拟机配置java安装hadoop安装与配置克隆虚拟机ssh安装使用&#xff0c;免密登录更改hadoop配置结束语总体步骤 1、虚拟机配置 2、java安装 3、hadoop下载配置 4、复制虚拟机 5、ip更换&#xff0c;使用固定ip&#xff0c;并且每台…

Linux基本指令集合

Linux基本指令1&#xff0c;ls命令2&#xff0c;pwd命令3&#xff0c;whoami4&#xff0c;cd命令5&#xff0c;touch命令6&#xff0c;mkdir命令7&#xff0c;rmdir与rm命令8&#xff0c;man命令9&#xff0c;cp命令10&#xff0c;tree命令11&#xff0c;mv命令12&#xff0c;c…

智慧城市的发展趋势

智慧城市&#xff0c;是指在城市发展过程中&#xff0c;在城市基础设施、资源环境、社会民生、经济产业、市政治理领域中&#xff0c;充分利用物联网、互联网、云计算、IT、智能分析等技术手段&#xff0c;对城市居民生活工作、企业经营发展和政府行政管理过程中的相关活动&…

HTML学生个人网站作业设计:我的家乡网站设计——南宁留言表单 无js 页面8个

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家乡旅游景点 | 家乡民生变化 | 介绍自己的家乡 | 我的家乡 | 家乡主题 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#xff1a;样式 在…

泰克/Tektronix A622电流探头型号规格参数介绍

Tektronix/泰克电流探头A622产品介绍 品牌&#xff1a;Tektronix 产地&#xff1a;美国 Tektronix泰克A622交直流电流探头适用于万用表和示波器钳型;通用BNC接口。 Tektronix/泰克电流探头A622产品特点&#xff1a; AC/DC-100kHz 50mA to 100A峰值 适用于万用表和示波器 钳形开…

HTML期末大学生网页设计作业——奇恩动漫HTML (1页面) HTML+CSS+JS网页设计期末课程大作业

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

C++:函数:回调函数:还不懂回调函数来捶我

前言 不知道你是否有这样的疑问&#xff0c;我们为什么需要回调函数&#xff0c;直接调用函数不就可以了吗&#xff1f;回调函数到底有什么用&#xff1f;程序员该如何理解回调函数了&#xff1f; 这篇文章就为你解答这些问题&#xff0c;读完这篇文章后&#xff0c;你的编程…

连接肠菌与宿主的桥梁:肠菌代谢物——肠菌功能研究新篇章

人的肠道内寄居着多种微生物&#xff0c;他们统称为肠道菌群。研究表明&#xff0c;肠道菌群失衡会导致多种人体疾病&#xff0c;包括糖尿病、肿瘤、心血管疾病、神经系统疾病等。 那么肠菌是怎么对人产生影响的呢&#xff1f;答案是肠菌产生的代谢物&#xff08;1, 2&#xf…

Vue3+nodejs全栈项目(资金管理系统)——后端篇(一)登录、注册

文章目录初始化创建项目配置跨域配置解析表单数据的中间件安装bodyparser初始化用户路由模块抽离用户路由模块中的处理函数登录注册新建admin表安装并配置mysql模块注册检测表单数据是否合法检测用户名是否被占用对密码进行加密处理bcryptjs插入新用户测试登录根据名字查询用户…

CDH6.3.2处理Zookeeper因未授权访问造成的漏洞

1.zookeeper的基本情况 zookeeper是分布式协同管理工具&#xff0c;常用来管理系统配置信息&#xff0c;提供分布式协同服务。zookeeper官网下载软件包&#xff0c;bin目录下有客户端脚本和服务端脚本。另外还有个工具对理解和使用zookeeper服务非常有用&#xff0c;即zk-ui&am…

文本层次语义元素

html5-文本层次语义元素 第1关_文本层次语义元素相关概念 第2关_文本层次语义元素 编程要求 在右侧编辑器中的Begin - End区域内补充代码&#xff0c;具体要求是&#xff1a; 1.运用HTML5中的语义化元素设计一个文章区(<article>)。 2.文章区中的头部为文章的标题&a…

如何自己开传奇单机架设超详细图文教程

如何自己成为传奇&#xff0c;如何自己搭建传奇非官服&#xff0c;首先下载传奇服务器后&#xff0c;会有两个压缩包&#xff0c;一个用于服务器&#xff0c;一个用于游戏补丁文件 传奇单机设置-GOM引擎的超详细图文教程 版本文件包含.exe&#xff0c;以上文件都不起作用。 …

共享里的文件被删除了怎么办?可尝试这三种恢复方法

共享里的文件被删除了怎么恢复&#xff1f;删除之后就马上去回收站找&#xff0c;可是没回收站里没有怎么办&#xff1f;——来自某xx小伙伴的咨询。如果你也出现同样的疑惑&#xff0c;那么可以尝试下面的三种方法恢复共享里的文件。 方法一、以前的版本恢复 从Windows XP SP…

前端获取ip地址判断国家请求不同baseUrl

项目背景 项目新需求&#xff1a;根据ip地址区分出国内外上网&#xff0c;axios 使用不同的baseurl&#xff0c;上传阿里oss不同bucket 获取ip地址 一、使用js自己获取 使用 RTCPeerConnection.setLocalDescription() WebRTC API pc端没问题&#xff0c;移动端不好使 //获取…

react源码分析:深度理解React.Context

开篇 在 React 中提供了一种「数据管理」机制&#xff1a;React.context&#xff0c;大家可能对它比较陌生&#xff0c;日常开发直接使用它的场景也并不多。 但提起 react-redux 通过 Provider 将 store 中的全局状态在顶层组件向下传递&#xff0c;大家都不陌生&#xff0c;…

第十期|惊!游戏广告主投放十万被骗,推广作弊竟全是虚拟用户

顶象防御云业务情报中心发现&#xff0c;在互联网生态中存在很多灰色的渠道刷量工作室&#xff0c;渠道方通常以低廉的价格通过这些工作室提高广告URL点击量、应用下载激活量、注册量和真实的推广数据提起反馈给广告主结算&#xff0c;但其提供的数据质量和价格一样低廉&#x…

用DevExpress实现基于HTMLCSS的桌面应用程序的UI(一)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

RabbitMQ的高可用和高可靠

01、什么是高可用机制 所谓高可用&#xff1a;是指产品在规定的条件和规定的时刻或时间内处于可执行规定功能状态的能力。 当业务量增加时&#xff0c;请求也过大&#xff0c;一台消息中间件服务器的会触及硬件&#xff08;CPU,内存&#xff0c;磁盘&#xff09;的极限&#x…