导学:索引什么时候失效?为什么类型转换索引会失效?不满足最左匹配原则?
- 我们都知道,MySQL它主要有2大模快组成,第一块就是我们的MySQL服务,里面包含了像连接管理、解析器、预处理、优化器、执行器,这个会把一条SQL语句执行的前置工作会做完,然后会生成一个执行计划,给到我们的存储引擎组件。
- 存储引擎负责数据的存储、操作以及解锁。MySQL支持的存储引擎有很多,比如InnoDB、MyISAM、Memory等等,不同的存储引擎,存储与操作的方式也不一样。
今天要研究的是 InnoDB 存储引擎,因为 InnoDB是我们MySQL默认的存储引擎 ,索引也是研究InnoDB 存储索引。
官网:MySQL :: MySQL 8.0 Reference Manual :: 16 Alternative Storage Engines
- 存储引擎是MySQL组件,可以为不同的表类型处理SQL操作。InnoDB是默认的,也是最通用的存储引擎,Oracle推荐使用它来存储表,除了特殊的用例。(MySQL 8.0中的CREATE TABLE语句默认创建InnoDB表)
- MySQL服务器使用可插拔的存储引擎架构,允许存储引擎在运行的MySQL服务器中加载和卸载。
- 要确定服务器支持哪些存储引擎,请使用SHOW engines语句。
- Support列的值表示是否可以使用该引擎:“YES”、“NO”和“DEFAULT”表示该引擎存在、不可用或可用,当前设置为默认的存储引擎。
-- 用于显示当前数据库可用的存储引擎列表,并显示它们的状态、默认值以及是否支持事务等信息
show engines;
- Comment:注释
- Transactions:是否支持事务
- XA:表示是否支持XA分布式事务协议(涉及到两阶段提交)
- Savepoints:表示该存储引擎是否支持Savepoints
Savepoints
- Savepoints:它是一种在事务中创建的检查点(checkpoint),通过创建和使用SavePoints,可以在事务执行期间对事务进行部分回滚或回滚到先前的状态。
- 在事务中,Savepoints可以用来标记一个临时的保存点,以保留事务中的某个特定状态,这样,如果事务后续出现错误或需要回滚,可以根据需要回滚到先前的Savepoints,而不需要回滚整个事务。
- 通过Savepoints,可以更细粒度的控制事务的回滚操作,提供更灵活的事务管理能力。
- 使用"SAVEPOINT"命令来创建Savepoints,并使用"ROLLBACK TO SAVEPOINT"命令回滚到特定的Savepoint。
- 注意:Savepoints只在某些支持事务的存储引擎中可用,比如InnoDB。
MySQL 8.0支持的存储引擎
1. InnoDB: MySQL 8.0默认的存储引擎。
- InnoDB是一个事务安全(兼容ACID)的MySQL存储引擎,具有提交、回滚和崩溃恢复功能,以保护用户数据。
- InnoDB行级别的锁(没有升级到更粗粒度的锁)和oracle风格一致的非锁读取提高了多用户并发性和性能。
- 非锁读取(non-locking read)是指在读取数据时不对数据进行加锁的操作,也就是说其它事务仍然可以对数据进行修改操作。
- InnoDB将用户数据存储在聚集索引中,以减少常见的基于主键的查询的I/O。为了维护数据的完整性,InnoDB还支持外键引用完整性约束。
2. MyISAM:这些表占用空间很小。
- 表级锁限制了读/写工作负载的性能,因此它经常用于Web和数据仓库配置中的只读或以读为主的工作负载中。
3. Meomry - 内存:
- 将所有数据存储在RAM内存中,以便在需要快速查找非关键数据的环境中快速访问。这个引擎以前被称为堆引擎。
- 它的用例正在减少;InnoDB的缓冲池内存区提供了一种通用且持久的方式来将大部分或所有数据保存在内存中,而NDBCLUSTER为大型分布式数据集提供了快速的键值查找。
那么InnoDB存储引擎的数据怎么存的呢?
- 肯定会存到磁盘,磁盘里面会有文件,也就是表空间。
表空间最后都是一个page页的数据结构,然后page页里面是我们的row(行数据 / 数据行) => MySQL最小的数据单元。 page页是内存跟磁盘交互的最小单位,page页的大小默认是16K。- 每次查询都去跟磁盘交互太慢了,所以多了一个Buffer-Pool内存区间的概念。
- 有了Buffer-Pool以后,每次查询数据,先去内存查,如果没有,那么再去从磁盘读取,读取后,放到内存,所以Buffer-Pool提升了性能,尽可能的减少跟磁盘的实时IO。因为我内存更改了以后,我所有的数据是异步同步到磁盘的。
- 内存跟磁盘的同步最小单位是page页。
- 一个page页里面到底能存多少数据,根据我的page页的大小以及行大小来决定的。
索引的概念
- 索引(Index)是帮助MySQL高效获取数据的一种数据结构。
索引作用
-
索引的作用只有一个,提升查询性能!
-
SQL语句查询一般要求不能超过10毫秒或者20毫秒,如果超过就是进行优化。
索引创建
- 官网:MySQL :: MySQL 8.0 Reference Manual :: 13.1.15 CREATE INDEX Statement
- 在MySQL当中,index_type:USING{BTREE | HASH}
count(1)、count(*) 与 count(字段/列名) 的区别
- count(1)和count(*)表示的是直接查询符合条件的数据库表的行数。
- 而count(列名)表示的是查询符合条件的列的值不为NULL的行数。
- 除了查询得到结果集有区别之外,在性能方面count(*)是约等于count(1)的,但是