😊 @ 作者:Lion J
💖 @ 主页: https://blog.csdn.net/weixin_69252724?spm=1000.2115.3001.5343
🎉 @ 主题: 数据库mysql(高级部分)
?? @ 创作时间:2024年01月24日
————————————————
提示:以下是本篇文章正文内容,下面案例可供参考
服务架构是mysql的骨架结构, 分为连接层, 服务层, 引擎层, 数据文件层
连接层主要用于处理与客户的连接,授权认证,以及安全认证
完成sql服务的核心服务, 如相关的sql接口, 以及数据的缓存, sql的分析, 以及内置函数的执行, 是否利用索引查询
负责与文件层进行交互操作, 是否支持索引, 锁定水平…
在文件系统(硬盘)上存储数据, 日志
1. 概述
在mysql中用到的存储机制, 是否支持索引, 支持的锁定水平等各种功能技术, 不同的技术与配置方式叫做引擎
2. 两种主要引擎
●InnoDB
●MyISAM
在数据量大(万级数据)可以高效的查询数据
数据库中维护的特定查找算法的数据结构叫做索引, 他是一种排好序的快速查找的数据结构
类似与书上的目录, 不用再寻找书中的数据时每次一页一页的翻, 可以直接通过目录来减小数据的范围,逐渐筛选出结果, 做到高效查找自己想要的数据;
图例:
将数据库中的数据与索引库中的数据一一对应, 提高检索效率
●优势
- 索引可以快速的提高检索效率,降低数据库的IO成本(从系统文件上读取)
- 索引对查询纪录结果进行排序, 分组, 降低原本mysql结果排序对CPU的消耗
●劣势
- 由于创建索引之后, 索引相当一张表, 保存主键与索引字段,以及指向实体表的纪录的物理地址, 会占用磁盘空间
- 数据的增删改不仅会改变实体表的纪录, 还会改变索引关系表(索引树)的纪录, 所以会降低更新表数据的速度,造成实际业务的拖延,增加数据库压力
这里以mysql数据库为例
顾名思义就是将表中的主键当作索引列, 数据库会自动再主键上添加索引
语句
#增加
alter table [表名] add primary key
#删除
alter table [表明] drop primary key
可以给某一列添加索引, 就是最常用索引
语句
#添加
create index 索引名 on 表名(列名)
#删除
drop index 索引名 on 表明
如:create idnex admin_account_index on admin(account)
单值索引查询效率比主键索引性能低
原因: 主键索引的值在整个表中必须是唯一的,这使得数据库可以更快地定位到特定的行。相比之下,单值索引可能不保证唯一性,因此查询可能需要检查更多的行
唯一索引这里的唯一指的是这一列的纪录是唯一的, 可以想象成主键索引的低配版, 列里的值允许null
语句
create unique index on 表名(列名)
drop index 索引名 on 表名
唯一索引与前面例子类似,唯一就是要求
●概念
组合索引可以想象为多个单值索引, 但是总体来说, 组合索引比多个单值索引的开销更小, 当行数远远大于列数时候, 可以适当的添加组合索引
语句
create index on 表名(列名,列名,列名)
drop index on 表明
●组合索引最左前缀原
假如有三个列abc,添加组合索引ab, 那么在将组合索引的列作为查询条件时, 必须要出现最左侧列, 不然组合索引不生效
演示
(应该叫组合索引, 图中口误🤣)
这是组合索引生效例子
组合索引失效
由于mysql在模糊查询时候, 一般的索引都不生效, 所以有专门应对该问题产生了全文索引
语法
CREATE FULLTEXT INDEX 索引名 ON 表名(字段名) WITH
create fulltext index 索引名 on 表明(列) preset
图示:
先使用单值索引, 索引列名name
再使用全文索引
注意:在使用全文索引时,进行模糊查询语法稍微不一样
SELECT 结果 FROM 表名 WHERE MATCH(列名) AGAINST(‘搜索词’)
索引数据结构是B+树的结构
为什么不能是二叉树?
因为数据库里的主键一般都是自增的, 而根据二叉树的性质知道, 此时的索引树将会向一边倾斜, 导致高度非常高(和链表一样), 反而查询效率更慢为什么不能是红黑树?
红黑树虽然可以通过子旋转,但是还是会向一边来加元素, 问题同上
用B+树,非叶子结点上放数据的索引, B+树的性质刚好可以让一个非叶子结点放大量的索引;而将数据放到一个个的叶子结点里,所有叶子结点(数据之间有链指针)
这样可以在全表扫描时,查询某一索引时,快速锁定该索引, 再向下获取该索引对应数据
在sql范围查询时, 也可以通过链指针快速得到范围内的数据
图示:
●聚簇索引:
只在执行sql查询操作时, 可以通过索引直接获取数据, 比如InnoDB里的主键索引(一级索引)
聚簇是设计: InnoDB,索引与数据如下
●非聚簇索引:
指的是,索引存储与数据存储是分离的, 比如在Myisam引擎,
>索引与数据关系如下
innodb与myisam虽然聚簇式设计与非聚簇式索引, 但是并不代表查询时候的索引都是聚簇索引与非聚簇索引,仅仅是根据两种思想设计的
如一个表 字段 a(主键),b,c,字段c(单值索引)
selelct b,c from test where c = 33
该sql通过c的索引树查询到的索引结点数据是主键id, 再需要通过主键id重新查询一下,该sql查询中, c索引就是非聚簇索引
例子同上
select id from test where id = 1
该种查询就直接查询到对应的索引结点,再通过索引结点直接获取内存里的数据物理地址