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


猜你喜欢
- 具体代码如下所示:import smtplib, email, os, timefrom email.mime.multipart impo
- python open() 函数以指定模式打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。w 模
- 本文实例讲述了JavaScript实现控制打开文件另存为对话框的方法。分享给大家供大家参考。具体如下:这里通过JS打开图片另存为对话框,提示
- 1. mysql_where子句_聚合函数# ### part 单表查询""" select ... from
- Error是Go语言开发中最基础也是最重要的部分,跟其他语言的try catch的作用基本一致,想想在PHP JAVA开发中,try cat
- 一、读者指引 读者指引帮助你掌握本文的梗概。以免你看了大半才明白这编文章不适合你,给你造成视觉污染。如果你正在用ASP+XML写一些程序,或
- 由于分形树具有对称性,自相似性,所以我们可以用递归来完成绘制。只要确定开始树枝长、每层树枝的减短长度和树枝分叉的角度,我们就可以把分形树画出
- 需求分析背景:1.数据列表页,滚动加载数据;2.多条数据情况下,点击某一条,进入详细页进行编辑(修改,删除)操作;3.保存返回上一页;在上面
- 本文实例讲述了Python迭代器与生成器用法。分享给大家供大家参考,具体如下:迭代器,迭代的工具什么是迭代器?指的是一个重复的过程,每一次重
- 内容摘要:“ASP”(Active Server Pages)作为一种典型的服务器端网页设计技术,被广泛地应用在网上银行
- 如下所示:L = ['adam', 'Lisa', 'bart', 'Paul
- 在制作表单的时候,我们往往用CSS来重新定义表单元素(如输入框、按钮等)的样式,以便看起来更加美观。而表单中的很多不同元素(如输入框、提交按
- 我的PJBlog在从2.7升级的3.0的时候,犹豫了很久。升级到PJBlog3.0就是看中了新增的静态页面功能,但是同时又担心造成博客出现大
- 背景:最近在做vue的项目,因为页面的逻辑比较复杂,代码量较多,所以就想抽离出一些组件放到component里面。问题就随之来了。因为vue
- 一、写在开头哈喽兄弟们之前经常编写Python脚本来进行数据处理、数据传输和模型训练。随着数据量和数据复杂性的增加,运行脚本可能需要一些时间
- 在日常的生活和工作中,我们经常会遇到一些大小问题,其中有很多的问题,都是可以使用一些简单的Python代码就能解决。比如不久前的复旦大佬,用
- 在获取 IP 时,已经成功将各个网站的代理 IP 获取下来了,然后就需要一个检测模块来对所有的代理进行一轮轮的检测,检测可用就设置为满分,不
- 一、遍历通过for。。。in。。。的语法结构,我们可以遍历字符串、列表、元组、字典等数据结构。1、字符串遍历a_str = "he
- 一、os常用方法1.获取当前路径 os.getcwd()# coding:utf-8import osif __name__ == '
- js代码:$(".head").change(function() {var val = $(this).val();i