MySQL
文章平均质量分 82
五敷有你
稳中求进,多平安
展开
-
redoLog&undoLog&binLog
undo log和redo log 记录的物理日志不一样,他是逻辑日志,可以认为当delete一条数据时,undo log会记录一条对应的insert记录,反之亦然,当update一条记录时,他记录一条与之相反的update记录,当执行rollback时,就可以从undo log中的逻辑记录读取到相对应的内容并进行回滚。而缓冲区的脏页并不是实时刷新的,而是一段时间后将缓冲区的数据刷新到磁盘中,加入刷新到磁盘的过程中出错了,而提示用户数据提交完成,数据却没有持久化下来,就会出大问题的。没有保证事务的持久性。原创 2024-05-12 09:48:25 · 806 阅读 · 36 评论 -
事务的基础
实际上分为两个部分,其中的原子性,一致性,持久性,实际上是由InnoDB的两份日志来保证的,一份是redo log日志,一份是undo log日志。事务是:一组操作的集合 ,他是不可分割的工作单位。那实际上,我们研究事务的原理就是研究MySQL的InnoDB引擎如何保证事务的这四大特性。原子性:事务是一个不可分割的最小单元,要么全部成功,要不全部失败。持久性:事务一旦提交或者回滚,他对数据库的数据改变就是永久的。隔离性:数据库保证事务不受外部并发操作影响的独立环境下运行。原创 2024-05-12 09:07:24 · 346 阅读 · 0 评论 -
MySQL的行级锁
并不是,因为是非唯一索引,这个 结构中可能有多个18的存在,所以,在加锁时会继续往后找,找到一个不满足条件的值(当前案例中也 就是29)。默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜索和索引扫描,以防止幻读。2.InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中所有数据记录加锁,此时就。排他锁(X):允许获取排他锁的事务执行更新语句,组织其他事务获取相同数据的共享锁与排他锁。原创 2024-05-11 10:43:58 · 704 阅读 · 4 评论 -
MySQL的表级锁
表共享读锁表独占写锁。原创 2024-05-11 08:00:00 · 472 阅读 · 33 评论 -
MySQL的全局锁
全局锁就是对整个数据库实例加锁,加锁后实例状态就处于只读状态,后续的DML的写语句,DDL语句,都将被阻塞。典型的常见就是做全库的逻辑备份,将所有的表进行锁定,从而获取一致性视图,保证数据的完整性。那备份的时候不加全局锁会怎样??假如现在有三张表,tb_stock .tb_order ,tb_orderlog进行备份的时候先备份stock库存表,然后有业务扣减库存(修改的库存),生成订单 (修改了订单表)之后备份order订单表,此时订单表是操作后的数据信息。原创 2024-05-10 10:00:00 · 592 阅读 · 1 评论 -
前缀索引与单列&联合索引的选择
选择性是指不重复的索引值(基数)和数据表记录的总数的比值,索引选择性越高效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引, 而非单列索引。此时不是立刻返回,因为匹配都是匹配的前缀,拿到后应该去用email的值去与条件的email比较,是:返回,通过上述执行计划,我们可以看出来在name字段是有两个索引的一个单列索引,一个联合索引。,这样可以大大节约索引的空间,从而提高索引的效率。原创 2024-05-10 08:00:00 · 824 阅读 · 0 评论 -
索引的SQL提示与覆盖索引
因为在联合索引的可以找到全部需要的数据(非叶子节点有name,phone age, 叶子节点有id),所以不需要回表。explain select * from tb_user force index(idx_name) where name ='吕布'尽量使用覆盖索引(查询是使用了索引,并且需要返回的列在该索引中已经全部能找到),减少使用select *。use index 代表 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据。force index(索引名)原创 2024-05-09 10:24:44 · 1060 阅读 · 2 评论 -
索引失效情况
因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不 如走全表扫描来的快,此时索引就会失效。这是个在MYSQL查询的时候,会对语句进行评估,如果走全表扫描的时间比走索引慢,则放弃锁引,走全表扫描。创建age的索引,注意idx_user_age的索引命名规范,我就随便写了,运行后如下:索引执行。在tb_user的phone列加上索引,然后进行条件查询,在这个情况下,是可以走索引的。首先age是没有索引的,仅仅依靠age,复合索引是不生效的。在不加上单引号的情况,如图,是进行的全文扫描。原创 2024-05-09 09:36:52 · 726 阅读 · 39 评论 -
最左前缀法则
但是查询时,跳过了phone这个列,所以后面的列索引是不会使用的,也就是索引部分生效,所以索 引的长度就是202。注意 : 最左前缀法则中指的最左边的列,是指在查询时,联合索引的最左边的字段(即是 第一个字段)必须存在,与我们编写SQL时,条件编写的先后顺序无关。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃了某一列,索引将会部分失效。对于最左前缀法则,指的是查询时,最左边的列,也就是id,必须存在,否则索引全部失效,而且中间不能跳过某一列,否则该列后面的字段索引将全部失效。原创 2024-05-08 17:59:28 · 546 阅读 · 2 评论 -
SQL语句的性能分析
最终我们发现,在慢查询日志中,只会记录执行时间超多我们预设时间(2s)的SQL,执行较快的SQL 是不会记录的。慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:s,默认是10s)d的所有SQL语句的日志。# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志。那这样,通过慢查询日志,就可以定位出执行效率比较低的SQL,从而有针对性的进行优化。以上都是按照时间层次的判定,执行时间长就好,执行时间短就不好,但这是一种粗略的判定。原创 2024-05-08 16:29:58 · 720 阅读 · 1 评论 -
MySQL的索引
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引。假如我们要执行的SQL语句为 : select * from user where age = 45;1). 无索引情况在无索引情况下,就需要从第一行开始扫描,一直扫描到最后一行,我们称之为 全表扫描,性能很 低。2). 有索引情况。原创 2024-05-08 11:29:35 · 1511 阅读 · 36 评论