文章目录
- MySQL的优点
- 视图
- MySQL的存储过程与函数
- 触发器
- MySQL的基本架构
- MySQL的引擎
- InnoDB
- MyISAM
- 总结
- 索引
- 什么是索引?
- 索引的优缺点
- 索引底层数据结构
- 索引的分类
- 创建索引的原则
MySQL的优点
MySQL 主要具有下面这些优点:
- 成熟稳定,功能完善。
- 开源免费。
- 文档丰富,既有详细的官方文档,又有非常多优质文章可供参考学习。
- 开箱即用,操作简单,维护成本低。
- 兼容性好,支持常见的操作系统,支持多种开发语言。
- 社区活跃,生态完善。
- 事务支持优秀, InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失,并且,InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的。
- 支持分库分表、读写分离、高可用。
视图
视图就是将一条sql语句封装起来,之后使用sql时,只需要查询试图即可,视图不保存数据。
-- 定义一个视图 create view view_admin as select * from admin -- 使用视图 select * from view_admin -- 删除视图 drop view view_admin
MySQL的存储过程与函数
存储过程就是一组预定义的 SQL语句结合,存储在数据库中并分配一个名称,可以在需要时进行调用;函数是一段预定义的SQL代码,用于执行特定的计算或操作,并返回结果。函数类似于存储过程,但是函数通常返回一个值,而存储过程可以执行多个操作不一定返回结果。两者的区别是函数一般接收参数并返回值,用于计算、转换和处理数据。而存储过程一般执行一系列的操作和业务逻辑,通常用于处理复杂的业务逻辑,管理事务或执行批处理操作。
触发器
触发器是一种特殊的存储过程,不需要用户直接进行调用,会在用户对表进行增删改操作之前或之后自动触发,
MySQL的基本架构
MySQL的基本架构主要有以下几层:
连接层:负责接收客户端的连接请求,可以进行认证(验证账号密码)
服务层:接收sql,语言解析,优化,缓存
引擎层:引擎层是真正落实实现的具体方式,不同的存储引擎特点不同
物理文件存储层:使用各种文件用来存储数据,以及各种日志文件
MySQL基本架构的核心组件:
连接器: 身份认证和权限相关(登录 MySQL 的时候)。
查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
解析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
优化器: 按照 MySQL 认为最优的方案去执行。
执行器: 执行语句,然后从存储引擎返回数据。 执行语句之前会先判断是否有权限,如果没有权限的话,就会报错。
插件式存储引擎:主要负责数据的存储和读取,采用的是插件式架构,支持 InnoDB、MyISAM、Memory 等多种存储引擎。
MySQL的引擎
MySQL的默认存储引擎是InnoDB,并且所有的存储引擎中只有InnoDB是事务性存储引擎。
InnoDB
优点: InnoDB是事务型存储引擎,它支持ACID特性,支持行级锁(一个事务对某行数据操作时,只会锁定某一行数据,不锁定其他行,效率高),提供了更好的MVCC机制,支持外键约束,支持缓存,支持全文索引。
缺点: 相较于MyISAM,InnoDB的存储和管理需要更多的内存和磁盘空间,同时也对CPU的要求较高。
MyISAM
优点: MyISAM简单易于管理,支持表锁(进行dml操作时会锁定整张表),主要用户查询多,增删改较少的场景。支持全文索引,存储表的总行数。
缺点: MyISAM不支持事务和行级锁,不支持主外键
总结
- InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。
- MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。
- MyISAM 不支持外键,而 InnoDB 支持。
- MyISAM 不支持 MVCC,而 InnoDB 支持。
- 虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
- MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。
- InnoDB 的性能比 MyISAM 更强大。
索引
什么是索引?
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。
索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。
索引的优缺点
优点:
- 使用索引可以大大加快 数据的检索速度(大大减少检索的数据量), 这也是创建索引的最主要的原因。
- 过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
缺点:
- 创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。
- 索引需要使用物理文件存储,也会耗费一定空间。
大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。
索引底层数据结构
常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。
—>B树、B+树详解
索引的分类
底层存储方式:
聚簇索引:所查即所得,找到了索引就是找到了数据,例如主键索引。
非聚簇索引:索引和数据是分离的,找到了索引,还没有找到数据,需要根据主键,再次回表查询,在MyISAM引擎中,除了主键列,其他都是非聚簇索引
判断聚簇索引和非聚簇索引的方法
按照应用维度分:
主键索引:查询加速,列值唯一(不能为NULL),表中只有一个
普通索引:仅查询加速
唯一索引:查询加速,列值唯一
覆盖索引:一个索引包含(或覆盖)所有查询字段的值
联合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,与其他索引类型不同,全文索引并不存储整个字符串的值,而是存储关键字
创建索引的原则
哪些情况创建索引
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引(where后面的语句)
- 查询中与其他表关联的字段,外键关系建立索引
- 查询中排序的字段,外键关系建立索引
哪些情况不建议创建索引
- 表记录太少
- 经常增删改的表,提高了查询速度,同时降低了更新表的速度
- where条件里用不到的字段
- 数据重复且分布均匀的表字段,