服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - Mysql索引创建删除及使用代价

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

2022-11-02 15:05把苹果咬哭的测试笔记 Mysql

这篇文章主要为大家介绍了Mysql索引创建删除及使用代价详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、Mysql 中索引的创建删除

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

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

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

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

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

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

?
1
2
3
4
5
6
7
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. 修改表结构时候添加索引

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

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

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

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

?
1
ALTER TABLE index_demo DROP INDEX idx_c2_c3;

二、索引的代价

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

1. 空间上的代价

这个是很显而易见的。

  • 每建立一个索引,就要为它建立一颗 B+ 树。
  • 而每一颗 B+ 树的每一个节点都是一个数据页,默认会占用16kb的存储空间。
  • 一颗很大的 B+ 树又是由许多数据页组成。

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

2. 时间上的代价

维护顺序的耗时

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

我们知道:

  • B+ 树中的每层节点都是按照索引列的值从小到大的顺序组成了双向链表。
  • 无论是叶子节点还是内节点,内部中的记录都是按照索引列的值的大小顺序,形成了一个单链表。

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

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

执行计划分析的耗时

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

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

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

小结

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

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

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

更多关于Mysql索引创建删除的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/wessonlan/article/details/124812980

延伸 · 阅读

精彩推荐
  • MysqlMySQL命令行方式进行数据备份与恢复

    MySQL命令行方式进行数据备份与恢复

    本文主要介绍了MySQL命令行方式进行数据备份与恢复,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    李昊哲-小课12102022-08-20
  • MysqlMysql排序的特性详情

    Mysql排序的特性详情

    这篇文章主要介绍Mysql排序的特性,新写了一个功能,自测和测试环境测试都没问题,但在生产环境会出现偶发问题。于是,加班到12点一直排查问题,终于定位了...

    程序新视界7512021-12-01
  • MysqlMySQL函数date_format()日期格式转换的实现

    MySQL函数date_format()日期格式转换的实现

    本文主要介绍了MySQL函数date_format()日期格式转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    你邻座的怪同学6462022-08-13
  • Mysql一步步教你配置MySQL远程访问

    一步步教你配置MySQL远程访问

    这篇文章主要给大家介绍了配置MySQL远程访问的相关资料,文中介绍的非常详细,相信对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    Myths5052020-07-26
  • Mysqlmysql 将字段time按天/月/年分组

    mysql 将字段time按天/月/年分组

    表中有一个字段time,格式为Unix时间戳,现需要按照该字段统计每天的记录数并按天/月/年分组 ...

    whsnow4942020-04-14
  • Mysqlmysql 5.7.20\5.7.21 免安装版安装配置教程

    mysql 5.7.20\5.7.21 免安装版安装配置教程

    这篇文章主要为大家详细介绍了mysql5.7.20和mysql5.7.21免安装版安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    antma2052020-08-25
  • MysqlMySQL给新建用户并赋予权限最简单的方法

    MySQL给新建用户并赋予权限最简单的方法

    在本篇文章里小编给大家整理的是一篇关于MySQL给新建用户并赋予权限最简单的方法,需要的朋友们参考下。...

    追梦者丶1722020-12-15
  • MysqlMysql将一个表中的某一列数据复制到另一个表中某一列里的方法

    Mysql将一个表中的某一列数据复制到另一个表中某一列里的方法

    今天小编就为大家分享一篇关于Mysql将一个表中的某一列数据复制到另一个表中某一列里的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参...

    CODETC7952019-06-24