Mysql索引创建删除及使用代价

作者:把苹果咬哭的测试笔记 时间:2024-01-16 15:32:35 

一、Mysql 中索引的创建删除

innodb 和 myisam 引擎会自动为主键或者带有 UNIQUE 属性的列建立索引。

如果要为其他列建立索引,就需要显示的指明。

1. 创建表的时候创建索引

CREATE TABLE 表名 (
   各个列的信息...,
   (KEY/INDEX) 索引名 (需要被索引的单个列或多个列)
)

注意,KEY 和 INDEX 任用其一即可,是同义词。

比如在创建 index_demo 表时为c2 和 c3 列添加一个联合索引:

CREATE TABLE index_demo(
   c1 INT,
   c2 INT,
   c3 CHAR(1),
   PRIMARY KEY(c1),
   INDEX idx_c2_c3 (c2, c3)
);

这里创建的索引的名称是idx_c2_c3,虽然索引名字可以任意起,但是建议以idx_为前缀,后面跟着要简历的索引的列名,多个列用下划线隔开。

2. 修改表结构时候添加索引

ALTER TABLE 表名 ADD (KEY/INDEX) 索引名 (需要被索引的单个列或多个列);

3. 修改表结构时候删除索引

ALTER TABLE 表名 DROP (KEY/INDEX) 索引名;

现在删除掉最开始建的索引idx_c2_c3,可以这样写:

ALTER TABLE index_demo DROP INDEX idx_c2_c3;

二、索引的代价

索引虽然是个好东西,但是不能肆意创建。

1. 空间上的代价

这个是很显而易见的。

  • 每建立一个索引,就要为它建立一颗 B+ 树。

  • 而每一颗 B+ 树的每一个节点都是一个数据页,默认会占用16kb的存储空间。

  • 一颗很大的 B+ 树又是由许多数据页组成。

所以,这会占用很大一片存储空间。

2. 时间上的代价

维护顺序的耗时

每当对表中的数据进行增删改操作时,都需要修改各个 B+树 索引。

我们知道:

  • B+ 树中的每层节点都是按照索引列的值从小到大的顺序组成了双向链表。

  • 无论是叶子节点还是内节点,内部中的记录都是按照索引列的值的大小顺序,形成了一个单链表。

所以,当进行增删改操作时,可能会对节点和记录的排序造成破坏,那么存储引擎就需要额外的时间进行页面分裂、回收等操作,以维护节点和记录的排序。

如果建立了很多索引,可想而知每个索引对应的B+ 树都要进行相关的维护操作,这要带来多大的消耗。

执行计划分析的耗时

在执行查询语句之前,首先会生成一个执行计划。

一般来说,一条查询语句在执行的过程中最多使用一个二级索引,在生成执行计划时需要计算使用不同索引执行查询时所需的成本,最后选择最低的那个索引进行查询。

如果建立了太多的索引,可能导致在进行成本分析的时候就耗时太多,从而影响查询语句的执行性能。

小结

综上所述,在一个表中建立的索引越多,占用的存储空间就越多,在增删改记录或者生成执行计划时性能也就越差。

所以,该怎样建立又好又少的索引?

本文参考书籍:《mysql是怎样运行的》

来源:https://blog.csdn.net/wessonlan/article/details/124812980

标签:Mysql,索引,创建,删除
0
投稿

猜你喜欢

  • django 外键model的互相读取方法

    2021-06-16 20:54:51
  • SQL Server 压缩日志与减少SQL Server 文件大小的方法

    2024-01-22 04:26:45
  • python模块中判断全局变量的赋值的实例讲解

    2021-01-05 13:29:37
  • Python 读写文件和file对象的方法(推荐)

    2022-01-09 08:36:03
  • python中namedtuple函数的用法解析

    2023-08-22 11:03:24
  • SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较

    2024-01-18 02:47:08
  • MySQL中对于not in和minus使用的优化

    2024-01-17 04:17:20
  • 用户体验 保守的使用下拉菜单

    2008-01-15 20:00:00
  • 如何让12px以下的文字最佳显示

    2008-01-24 18:39:00
  • MySQL Redo与Undo日志详细解析

    2024-01-26 04:40:09
  • 用Python制作一个可以聊天的皮卡丘版桌面宠物

    2021-12-05 10:44:41
  • Window下安装JDK1.8+Tomcat9.0.27+Mysql5.7.28的教程图解

    2024-01-26 22:24:12
  • asp如何实时获知多少人在线?

    2010-05-18 18:34:00
  • 使用Python和Prometheus跟踪天气的使用方法

    2021-05-15 14:31:05
  • Python selenium抓取微博内容的示例代码

    2021-11-17 05:32:43
  • Python正则表达式的应用详解

    2023-07-29 21:58:51
  • 5个有效改进网页UI设计的技巧

    2008-12-19 12:04:00
  • 用python写测试数据文件过程解析

    2022-03-24 16:54:57
  • Python深拷贝与浅拷贝用法实例分析

    2023-11-06 01:25:04
  • Python django搭建layui提交表单,表格,图标的实例

    2022-09-18 19:40:19
  • asp之家 网络编程 m.aspxhome.com