MYSQL的索引和存储引擎

article/2025/8/17 8:14:44

文章目录

    • MYSQL的索引和存储引擎
          • 介绍
          • 索引的分类
          • 单列索引-普通索引
          • 单列索引-唯一索引
          • 单列索引-主键索引
          • 组合索引
          • 全文索引
          • 空间索引
        • 索引内部原理剖析
          • 索引内部原理-Hash算法
          • 索引内部原理-二叉树和二叉平衡树
          • 索引内部原理-BTREE树
          • MyISAM存储引擎
          • InnoDB存储引擎
        • 索引的特点
          • 索引的创建原则
        • MySQL的存储引擎
          • MySQL存储引擎的操作

MYSQL的索引和存储引擎

介绍
索引是通过某种算法,构建出一个数据模型,用于快速查出在某个列中有一特定值的行,不使用索引,MYSQL必须从第一行记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MYSQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间.
索引类似一本书的目录,比如要查找student这个单词,可以先找到s开头的页然后向后查找,这个就类似索引.
索引的分类
索引是存储引擎用来快速查找记录的一种数据结构.
按照数据结构分:Hash索引② B+Tree索引
按照功能分:① 单列索引普通索引唯一索引主键索引② 组合索引③ 全文索引④ 空间索引
单列索引-普通索引
单列索引: 一个索引只包含单个列,但一个表中可以有多个单列索引
普通索引: MYSQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹是为了查数据更快一点.创建普通索引:方式1-创建表的时候直接创建索引create table student(sid int primary key,car_id varchar(20),name  varchar(20),index index_name(name) -- 给name列创建索引);方式2-直接创建create index index_name on student(name);方式3-通过修改表结构添加索引alert table student add index index_name(name);查看索引:查看数据库所有的索引select * from mysql.innodb_index_stats a where a.database_name='数据库名';查看表中的所有索引show index from student;删除索引drop index 索引名 on 表名;alert table 表名 drop index 索引名;
单列索引-唯一索引
唯一索引与前面的普通索引类似,不同的就是,索引列的值必须唯一,但允许为空,如果是组合索引,则列值组合必须唯一.创建普通索引:方式1-创建表的时候直接创建索引create table student(sid int primary key,car_id varchar(20),name  varchar(20),unique index_car_id(car_id) -- 给 car_id 列创建索引);方式2-直接创建create unique index index_car_id on student(car_id);方式3-通过修改表结构添加索引alert table student add unique index_car_id(car_id);删除索引drop index 索引名 on 表名;alert table 表名 drop index 索引名;
单列索引-主键索引
每张表一般都会有自己的主键,当我们在创建表时,mysql会自动在主键列上建立一个索引,这就是主键索引,主键是具有唯一性并且不允许为NULL,所以她是一种特殊的唯一索引.
组合索引
组合索引也叫复合索引,指的是我们在建立索引的时候使用多个字段,列入同时使用身份证和手机号建立索引,同样的可以建立为普通索引或者唯一索引.
复合索引的使用复合最左原则.创建索引:create index index_phone_car_id on student(phone,car_id); -- 普通的组合索引create unique index index_phone_car_id on student(phone,car_id); -- 唯一的组合索引删除索引drop index 索引名 on 表名;alert table 表名 drop index 索引名;eg:① select * from student where car_id='130825';② select * from student where phone='1523151';③ select * from student where phone='1523151' and car_id='130825';④ select * from student where car_id='130825' and phone='1523151';
四条sql只有②、③、④能使用到索引index_phone_car_id,因为条件里面必须包含索引前面的字段,才能够进行匹配;
而③、④相比where条件的顺序不一样,为什么④可以用到索引呢?因为mysql本身就是一层sql优化,他会根据sql来识别出该用哪个索引,我们可以理解为③、④在mysql眼中是等价的.
全文索引
全文索引的关键字是fulltext
全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,它更像是一个搜索引擎,基于相似度的查询,而不是简单的where语句的参数匹配.
用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少是合适的,但是对于大量的文本数据检索,是不可想象的,全文索引在大量的数据面前,能比like + %N,速度不是一个数量级的,但是全文索引可能存在精度问题.-- 修改表结构添加全文索引
alter table 表名 add fulltext 索引名(列名)
-- 添加全文索引
create fulltext index 索引名 on 表名(列名)
-- 使用全文索引
select * from 表名 where match(列名) against('yo');
空间索引
mysql在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型
空间索引是对空间数据类型的字段建立的索引,mysql中的空间数据类型有四种,分别是GEOMETRY,POINT,LINESTRING,POLYGON
MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引
创建空间索引的列,必须将其声明为NOT NULL
空间索引一般是用的比较少.
类型含义说明
GEOMETRY空间数据任何一种空间类型
POINT坐标值
LINESTRING线有一系列点连接而成
POLYGON多边形由多条线组成

索引内部原理剖析

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上,这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级.所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度.换句话,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数.

索引内部原理-Hash算法

在这里插入图片描述

索引内部原理-二叉树和二叉平衡树

在这里插入图片描述

在这里插入图片描述

索引内部原理-BTREE树

在这里插入图片描述

MyISAM存储引擎
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.
InnoDB存储引擎
InnoDB的叶节点的data域存放的是数据,相比MyISAM效率高一些,但是比较占硬盘内存大小.

索引的特点

-- 优点① 大大加快数据的查询速度② 使用分组和排序进行数据查询时,可以显著减少查询时分组和排序的时间③ 创建唯一索引,能够保证数据库表中每一行数据的唯一性④ 在实现数据的参考完整性方面,可以加速表和表之间的连接-- 缺点① 创建索引和维护索引需要消耗时间,并且随着数据量的增加,时间也会增加.② 索引需要占据磁盘空间③ 对数据表中的数据进行增加,修改,删除时,索引也要动态的维护,降低了维护的速度
索引的创建原则
① 更新频繁的列不应该设置索引
② 数据量小的表不要使用索引(毕竟总共2页的文档,还要目录?)
③ 重复数据多的字段不应设为索引(比如 性别,只有男和女一般来说:重复的数据超过百分之15就不应该建索引)
④ 首先应考虑对where和order by 和group by 涉及的列上建立索引

MySQL的存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据
不同的储存引擎提供不同的存储机制、索引技巧、锁定水平等功能,现在许多不同的数据库管理系统都支持多种不同的数据引擎,MySQL的核心就是存储引擎
用户可以根据不同的需求为数据表选择不同的存储引擎
可以使用SHOW ENGINES 命令可以查看MySQL的所有执行引擎我们可以看到默认的执行引擎是innoDB支持事务,行级锁定和外键.

在这里插入图片描述

MySQL存储引擎的操作
-- 查询当前数据库支持的存储引擎show engines;
-- 查看当前的默认存储引擎show variables like '%storage_engines%';
-- 查看某个表用了什么引擎(在现实结果里参数engine后面的就表示该表当前用的存储引擎)show create table student;
-- 创建表时指定存储引擎create table(...) engine=MyISAM;
-- 修改数据库引擎alter table student engine=InnoDB;alter table student engine=MyISAM;-- 修改MySQL默认存储引擎方法① 关闭mysql服务② 找到mysql安装目录下的my.ini文件③ 找到default-storage-engine = InnoDB 改为目标引擎④ 启动mysql服务

http://chatgpt.dhexx.cn/article/5CMDQwCX.shtml

相关文章

mysql 索引使用与优化

前言 索引对有一定开发经验的同学来说并不陌生,合理使用索引,能大大提升sql查询的性能,可以这么讲,随着业务数据量的不断增长,优化系统的响应速度,很大程度上可以说就是集中在索引的优化上; mysql索引原理 在正式了解与学习mysql索引之前,先对mysql的索引原理再次回…

MySql之索引

1.索引概述 MySql官方对索引的定义为:索引是帮助MySql高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查找算法&#xf…

Mysql 索引

图片来源网络,侵删。图片来源于掘金小册 索引 Mysql 的索引类型有很多种,Hash索引,B树索引,B树索引和全文索引。Mysql有多种存储引擎,每个存储引擎对索引的支持可能会不同。 What Mysql 索引是能改善数据库表随机访…

一文搞懂 MySQL 索引

一文搞懂 MySQL 索引 1、MySQL 索引 简介 1.1、MySQL 索引 是什么? 索引是一个单独的、存储在 磁盘 上的 数据库结构 ,包含着对数据表里 所有记录的 引用指针。 1.2、 MySQL 索引 的存储类型有哪些? MySQL中索引的存储类型有两种&#xff0c…

一文搞懂MySQL索引所有知识点(建议收藏)

Mysql索引 索引介绍 索引是什么 官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储…

python中的%用法

python中%: 1. 求模运算,相当于mod,也就是计算除法的余数,比如5%2就得到1。 2. %还用在python的格式化输出,比如: 说明如下: %[(name)][flags][width].[precision]typecode (name) 为命名 fl…

python中的消息弹窗

在写python代码中,经常要弹窗提示一下消息情况,因为有时候我同时用了多个ui框架,比如tkinter,pyqt等,经常找不到合适的弹窗模块。因此梳理了一下几种弹窗方案。 一、采用windows自带的api(需要导入win32api) 特别强调采用这种方案,这种方案的优势就是弹窗模态,并不需…

Python 中的\r 字符

今天遇到了\r,然后就比较懵了,这里简单记录一下\r字符在Python中的应用。 \r:将光标回退到开始位置 先来看一个示例代码: import timetext "Hello\rWorld!" for i in text:time.sleep(0.5)print(i, end"")…

python中flag的用法_python中flag什么意思

python中flag一般就是标记、标识的意思 比如&#xff1a;&#xff08;推荐学习&#xff1a;Python视频教程&#xff09;#!/usr/bin/python # -*- coding: UTF-8 -*- x 7 i 1 flag 0 while i < 100: if (x%2 1) and (x%3 2) and (x%5 4) and (x%65): flag 1 e…

python中result的用法_python中result的用法

Python中%(number,result)是什么意思 浮点型(Float) Python的浮点数就是数学中的小数&#xff0c;类似C语言中的double。 在运算中&#xff0c;整数与浮点数运算的结果是浮点数. 浮点数也就是小数&#xff0c;之所以称为浮点数&#xff0c;是因为按照科学记数法表示时&#xf…

解决python中文乱码问题

python输出中文乱码的问题相信大家都遇到过 那么应该如何解决呢&#xff1f; 一、修改系统变量 依次打开 设置->系统->关于->高级系统设置->环境变量->新建系统变量&#xff0c;新变量的变量名是&#xff1a;PYTHONIOENCODING&#xff0c;变量值是&#xff1…

python中value的含义_python中value的意思

python语句s = str(value)是什么意思呢 把value转成字符串,然后赋值给变量s 比如说,s=str(100)以后。 Python 比如有一串数据的话里面 value[:-1]是什么value[:-1] : value 应该是一个列表/元组, value[:-1]表示其最后一个元素 python 如何将字典中的value值CSS布局HTML小编…

python中注释

python中注释 在python中的注释一般分为单行注释、多行注释以及文档注释。 注释描述 在实际开发过程中&#xff0c;有效的代码注释不仅可以提升个人的工作效率&#xff0c;快速了解自己的程序情况&#xff0c;在团队协作开发过程中可以更加方便地让同事学习和调用你的代码。单…

python中的各种符号

运算符描述实例算术运算符%取模 - 返回除法的余数b % a 输出结果 0**幂 - 返回x的y次幂a**b 为10的20次方&#xff0c; 输出结果 100000000000000000000//取整除 - 返回商的整数部分&#xff08;向下取整&#xff09; >>> 9//2 4 >>> -9//2 -5 赋值运算…

python中的''''''字符串真的那么简单么?

文章目录 多行字符串&#xff0c;且保留代码格式&#xff01;文档&#xff01;&#xff01;&#xff01;注释功能 开门见山地说&#xff0c;如果你是一个接触Python一段时间的读者。那么你一定知道’和""可以灵活使用&#xff0c;例如以下的场景&#xff1a; s &quo…

Python基础篇

python是众多编程语言里面较为高级但也较慢的语言。所以&#xff0c;灵活地使用python内置的类和方法既可以减少代码量&#xff0c;也可以提高代码的运行速度。本文我们主要归纳python的一些基础知识&#xff0c;包括基本的类&#xff0c;内置方法&#xff0c;以及文件操作的一…

python中的函数(全)

函数的定义 概述&#xff1a;将一段经常使用的函数封装起来&#xff0c;减少重复代码&#xff0c;一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个模块实现特定的功能 于python中&#xff0c;定义函数时要用到def 语法结构&#xff1a; def 函数名称&…

linux 图形设计软件,Ubuntu下使用Blender 3D图形专业设计工具

如果你正在为你的Ubuntu Linux操作系统寻找免费而又够酷够炫的图形设计软件&#xff0c;你就来对地方了&#xff01;这一次&#xff0c;我们将为你介绍应用广泛而且免费的3D图形设计软件Blender 。 Blender是一个自由、开源的3D模型创作软件&#xff0c;不仅适用于Linux平台&am…

软件工程技术--第五章 详细设计

第五章 详细设计 5.1详细设计的任务与原则 详细设计&#xff08;又称为过程设计或模块设计&#xff09;&#xff0c;是编码的前导。 详细设计的根本目标是&#xff1a; 确定应该怎样具体地实现所要求的系统。经过这个阶段的设计工作&#xff0c;应该得出对目标系统的精确描…

1 画图软件设计概述

本人这段时间完成了一个小的绘图软件的设计&#xff1b;主要的功能包括&#xff1a; 1、文件操作&#xff08;打开、关闭、保存、打印、等&#xff09; 2、编辑功能 自由画笔&#xff0c;画点、直线、矩形、等 橡皮擦 撤销、恢复 3、查看功能&#xff0c;图片的放大、缩小…