MySQL~索引的优缺点是什么?有哪些优化索引的方法?

1.索引的优缺点

优点:提高查询记录的速度。

缺点:

  • 需要占用空间,索引是一种用空间换时间的做法
  • 创建索引和维护索引都需要消耗时间,会降低表的增删查改效率,因为每次进行增删查改,都需要对索引进行维护,需要消耗时间

什么情况下可以使用索引?

  • 经常作为查询条件的字段,如果需要同时查找多个字段,可以建立联合索引
  • 经常放到GROUP BY或者ORDER BY后面的字段,进行GROUP BY或者ORDER BY都会对数据进行排序,这些字段就可以建立一个索引,这样就不需要每次都进行排序了

什么情况下不可以使用索引?

  • 不经常作为查询条件的字段
  • 不经常放到GROUP BY或者ORDER BY后面的字段
  • 重复率高的字段,比如性别,建立索引并不会明显提高查询效率,毕竟索引也需要占空间。
  • 表数据量很少的时候,全表查也非常快,你创建维护索引反倒需要开销。
  • 经常需要更新的字段,如果建立了索引,索引也需要频繁维护(B+树是要保证数据有序的),会影响数据更新的效率。

2.如何优化索引?

前缀索引优化:对一个字符类型的字段使用前缀索引,前缀索引指的是只为前几个字符建立索引,而不是整个字段建立索引,这样可以减小索引的大小。

  • 适用场景:对于一些字符串很长的字段可以使用前缀索引
  • 局限性:1.order by无法使用前缀索引;2.无法把前缀索引用作覆盖索引

覆盖索引优化:建立适当的联合索引,如果要查询的字段就在联合索引中,就可以避免回表,提高查询效率

主键最好是自增的:因为MySQL中索引底层采用的是B+树的结构,它会对索引进行排序

        如果主键不是自增的,插入新的记录就很可能导致页分裂的情况,导致数据页的记录需要发生移动以此来维护索引的有序性,会影响到数据的插入效率。同时也可能会导致内存空间的浪费,影响查询效率。

        如下所示:假设数据页中存有1,3,5,9的索引数据,此时数据页已满,插入索引数据7就会导致页分裂,需要移动元素,同时后续左边的数据页只有小于7的数据才能使用了,大于7的数据就无法使用。

        如果主键是自增的,每插入一条记录,在数据页中都是追加操作,一个页不够了就开辟一个新的页,就不会发生页分裂的情况,插入效率更高。同时也不会有内存空间的浪费。

索引最好是not null

        如果索引列存在null会导致MySQL更加难以优化,会影响到查询的效率(比如进行统计的时候,count会省略为null的行)。

        null虽然是空,但是需要额外的一个字节来标识这个null值,更占用空间

防止索引失效

        有时候加上了索引,但是查询的时候可能会导致索引失效,没有使用到索引,所以我们要尽量避免索引失效。

1.使用左模糊匹配或者左右模糊匹配会导致索引失效,因为索引底层是B+树实现的,索引是有序的,只能根据前缀进行比较,在前缀相等的情况下,后续的字符才是有序的。所以无法用在左模糊和左右模糊查询中。

2.对索引列进行计算,函数,类型转换等操作,会导致索引失效。

  • 对于函数和计算,索引保存的是字段原先的值,而不是计算后的值。因此计算后的值无法使用索引。
  • 对于类型转换,比如MySQL在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较,此时实际上就是对字符串的列使用了CAST 函数,所以也会导致索引失效。

3.联合索引不遵循最左匹配原则,比如建立了联合索引(a, b),查询条件为where b = 1;,此时索引失效。原因:联合索引是先根据第一列排序,再根据第二列排序。你如果无法确定第一列,第二列就是无序的,自然就无法使用索引。

4.WHERE子句中,OR前后有一个不是索引列,会导致索引失效。因为OR的含义是两者满足一个即可,所以只有一个列有索引是没有意义的,都会进行全表扫描。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统设计蓝图 / 备忘单

开发一个强大、可扩展和高效的系统可能会令人望而却步。然而,了解关键概念和组件可以使这个过程更可管理。在本博客文章中,我们将探讨系统设计的关键概念和组件,如DNS、负载均衡、API网关等,以及一个简明的备忘单,可以…

自定义类型详解

目录 一、结构体类型 1.认识结构体 2.如何使用结构体类型 2.1按顺序初始化结构体,并通过.符号访问 ​2.2无序初始化结构体,并用.符号访问 2.3通过地址的方式访问结构体变量成员 2.4结构体的自引用 2.4.1错误的自引用 2.4.2正确的自引用 3.结构体内存…

Ansible 自动化运维工具(完善版)

目录 Ansible概述 Ansible特点 Ansible应用 1、使用者 2、Ansible工具集合 3、作用对象 Ansible的搭建 环境 ansible主机 1、ansible 2、Ansible-doc Ansible模块 1.command模块 2.shell模块 3.raw模块 Ansible概述 Ansible是最近非常火的一款开源运维自动化工具…

最全的ubuntu20.04上安装nvidia和cuda

文章目录 一、环境要求二、查询推荐安装的驱动版本三、安装470四、查看显卡驱动是否成功五、安装对应版本的cuda 官方路径 一、环境要求 ubuntu20.04如果之前有过驱动应该先卸载 sudo apt-get --purge remove nvidia* sudo apt autoremove# 卸载cuda sudo apt-get --purge r…

Oracle通过函数调用dblink同步表数据方案(全量/增量)

创建对应的包,以方便触发调用 /*包声明*/ CREATE OR REPLACE PACKAGE yjb.pkg_scene_job AS /*创建同步任务*/FUNCTION F_SYNC_DRUG_STOCK RETURN NUMBER;/*同步*/PROCEDURE PRC_SYNC_DRUG_STOCK(RUNJOB VARCHAR2) ; END pkg_scene_job; /*包体*/ CREATE OR REPL…

Hudi基础知识讲解

Hudi概述 Hudi是一种数据湖的存储格式,在Hadoop文件系统之上提供了更新数据和删除数据的能力以及消费变化数据的能力。支持多种计算引擎,提供IUD接口,在 HDFS的数据集上提供了插入更新和增量拉取的流原语。 基础架构图 Hudi特性 ACID事务能…

用户案例 | Apache DolphinScheduler 离线调度在自如多业务场景下的应用与实践

用户案例 | 自如 随着自如业务的快速发展,不断增长的调度任务和历史逾万的存量任务对平台稳定性提出了更高的要求。同时,众多非专业开发人员也需要一种更为“亲民”的调度平台使用体验。 如何满足这些日渐凸显的需求对自如大数据平台的开发团队来说&am…

2023年最全最新的学习课程合集

WEB前端入门:从零开始做网站。 完成所有课堂练习就可以做出自己的作品,并掌握数据库和了解开源项目。 这些课程涵盖了HTML、CSS和JavaScript等前端技术,以及与之相关的设计原则和最佳实践。 前端课程的目标是培养学生在网页开发方面的技能…

冒泡排序模拟实现qsort()函数

冒泡排序模拟实现qsort函数 前言1. 分析2. 解决一,如何接受不同数据3. 解决二,如何实现不同数据的比较4. 解决三,如何实现不同数据交换5. 模拟bubble_sort()函数排序整型所有代码实现6. 结构体排序实现7. 结尾 前言 要…

应急管理大屏助力暴雨天气下的水灾防范

随着气候变化和城市化进程的加剧,暴雨天气引发的水灾风险日益凸显。在面对这种自然灾害时,如何高效、及时地应对、减轻损失成为了当务之急。水灾应急管理平台的可视化大屏为相关部门和决策者提供了实时、全面的信息展示和决策支持,大大提升了…

逻辑(css)-背景网格制作(linear-gradient)

目录 linear-gradient需求实现 linear-gradient 语法:linear-gradient([direction], color-stop1, color-stop2, ...) 第一个参数为(可选)方向参数,可以是度数也可以是方位名词,方向与读书的关系如下: 角度方位文字说明示例0degto top从下…

左神算法之中级提升(2)

目录 [案例1】 【题目描述】 【思路解析1】 【思路解析2】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】今日头条2018面试题 第四题 【输入描述】 【思路解析】 【…