数据库
文章平均质量分 79
一江溪水
这个作者很懒,什么都没留下…
展开
-
MySQL如何避免幻读
事务的并发问题脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。幻读:A事务读取了B事务已经提交的新增数据。注意和不可重复读的区别,这里是新增,不可重复读是更改(或删除)。select某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。MySQL如何实现避免幻读在快照读读情况下原创 2021-11-14 15:24:18 · 2304 阅读 · 0 评论 -
MySQL的执行计划(三)
书接上回 MySQL的执行计划(二)执行计划中的列possible_keys显示在查询中使用了哪些索引key实际使用的索引,如果为NULL,则没有使用索引;查询中如果使用了覆盖索引,则该索引仅出现在key列中。possible_keys列表明哪一个索引有助于更高效的查询;key是possible_keys的子集;而key列表明实际优化采用了哪一个索引可以更加高效。key_len表示索引中使用的字节数,查询中使用的索的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。原创 2021-10-05 19:35:45 · 105 阅读 · 0 评论 -
MySQL执行计划(二)
书接上回:MySQL执行计划(一)执行计划中的列typetype列指代访问类型,是MySQL决定如何查找表中的行。是SQL查询优化中一个很重要的指标,拥有很多值,依次从最差到最优:ALL全表扫描,性能最差,在写SQL时尽量避免此种情况的出现,也就是避免是SELECT * index全索引查询,和全表查询的ALL类似,但是扫描表时按索引次序进行(遍历索引树),而不是按行扫描index与ALL虽然都是读全表,但index是从索引中读取,而ALL是从硬盘读取。显然,index性能上明显优原创 2021-10-05 18:59:10 · 98 阅读 · 0 评论 -
MySQL的执行计划(一)
什么是执行计划执行计划,就是一条SQL语句,在数据库中实际执行的时候,一步步的分别都做了什么事情EXPLAIN命令是查看查询优化器是如何决定执行查询的主要方法,从它的查询结果中我们可以知道:一个SQL语句每一步是如何执行的;都做了哪些事,分为哪几步;有没有用到索引;哪些字段用到了什么样的索引,是否有一些可优化的地方等。查看执行计划,只需在查询中的SELECT关键字之前增加EXPLAIN即可语法:EXPLAIN + SELECT查询语句示例:EXPLAIN SELECT * FROM `原创 2021-10-05 16:41:39 · 93 阅读 · 0 评论 -
MySQL的日志文件
二进制日志-binlog二进制日志-binlog,它是 MySQL 重要的日志模块,在 Server 层实现binlog 以二进制形式,将所有修改数据的 query 记录到日志文件中,包括:query 语句执行时间相关事务信息binlog 的开启,通过在配置文件 my.cnf 中,显式指定参数 log-bin=file_namestatement记录的是SQL语句,最后会有COMMIT。row记录的实际操作的数据记录,最后会有一个XID event。binlog的三种工作模式Ro原创 2021-10-04 16:08:58 · 186 阅读 · 0 评论 -
MySQL如何保证ACID
ACID原子性:事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行一致性:事务开始前和结束后,数据库的完整性约束没有被破坏。隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。持久性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。undo logundoLog 也就是我们常说的回滚日志文件 主要用于事务中执行失败,进行回滚,以及MVCC中对于数据历史版本的查看。undo log由引擎层的InnoDB引擎实现,是逻辑日志,记录数据原创 2021-10-01 16:23:53 · 1684 阅读 · 0 评论 -
MySQL索引(二)
MySQL索引(二)自适应哈希索引自适应哈希索引是InnoDB引擎的一个特殊功能,当它注意到某些索引值被使用的非常频繁时,会在内存中基于B-Tree索引之上再创键一个哈希索引,这样就让B-Tree索引也具有哈希索引的一些优点,比如快速哈希查找这是一个完全自动的内部行为,用户无法控制或配置,但如果有必要可以关闭该功能。空间索引MyISAM的表支持空间索引,可以用作地理数据存储和B-Tree索引不同,这类索引无需前缀查询。空间索引会从所有维度来索引数据,查询时可以有效地使用任意维度来组合原创 2021-09-05 14:25:19 · 72 阅读 · 0 评论 -
MySQL索引(一)
MySQL索引索引是什么索引是数据库中用来提高性能的常用工具,索引在 MySQL 中也叫“键(Key)”,是存储引擎用于快速查找记录的一种数据结构,这也是索引的基本功能。索引对于良好的性能很关键,尤其是当表中数据量越来越大时,索引对性能的影响愈发重要在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但数据量逐渐增大时,性能会急剧下降。索引类似一本书的目录,如果要在一本书中找到特定的知识点,先通过目录找到对应的页码在 MySQL 中,存储引擎用类似的方法使用索引,先在索引找到对应值原创 2021-09-04 16:16:04 · 75 阅读 · 0 评论 -
MySQL存储引擎
MySQL存储引擎MySQL 提供不同的技术存储数据,这些技术使用不同的数据存储机制、索引建立方式、锁方式来完成数据的构建,这些技术统称为存储引擎。MySQL 至少支持 9 种存储引擎,目前最受关注的是 InnoDB 和 MyISAM 存储引擎MyISAMMySQL5.5版之前的默认数据库引擎,性能不错,而且提供了大量的特性,包括全文索引、压缩、空间函数等但MyISAM不支持事务和行级锁, 而且崩溃后无法安全恢复。InnoDB由于MyISAM的不足,MySQL引入了InnoDB (事务性原创 2021-08-24 19:28:07 · 72 阅读 · 0 评论 -
一条SQL更新语句是如何执行的
MySQL日志文件二进制日志-binlog二进制日志,其实就是我们平常所说的 binlog,它是 MySQL 重要的日志模块,在 Server 层实现。binlog 以二进制形式,将所有修改数据的 query 记录到日志文件中,包括 query 语句、执行时间、相关事务信息等。InnoDB-redo logredo log,是存储引擎 InnoDB 生成的日志,主要为了保证数据的可靠性redo log 记录了 InnoDB 所做的所有物理变更和事务信息。redo log 默认存放原创 2021-08-23 14:16:43 · 64 阅读 · 0 评论 -
一条SQL查询语句是如何执行的
MySQL数据库的架构连接器: 身份认证和权限相关(登录 MySQL 的时候)。查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。分析器: 没有命中缓存的话,SQL 语句就会经过分析器,检查你的 SQL 语句语法是否正确,分析你的 SQL 语句要干嘛优化器: 按照 MySQL 认为最优的方案去执行。执行器: 执行语句,然后从存储引擎返回数据。...原创 2021-08-22 17:53:22 · 185 阅读 · 0 评论 -
MySQL事务和隔离级别
MySQL事务和隔离级别什么是事务事务是一组原子性的SQL查询,事务内的SQL语句,要么全部执行成功,要么全部执行失败最经典的例子就是转账了,假如小明要给小红转账100元,这个转账会涉及到两个关键操作就是:将小明的余额减少100元,将小红的余额增加100元。如果在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就很麻烦了。事务就是保证这两个关键操作要么都成功,要么都要失败。事务的特性事务具备 ACID 特性原子性(atomicity)一致性(consi原创 2021-08-21 17:09:50 · 80 阅读 · 0 评论