mysql 45讲学习记录
文章平均质量分 72
学习记录
勤学多练写博客
这个作者很懒,什么都没留下…
展开
-
10 | MySQL为什么有时候会选错索引?
mysql的表支持多索引,但是如果没有指定使用的索引,将由mysql确定使用哪个索引。执行的很快的语句,由于MySQL选错了索引,导致执行速度变得很慢?CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`), KEY `b` (`b`))select * from t where a原创 2022-01-12 01:28:01 · 222 阅读 · 0 评论 -
09 | 普通索引和唯一索引,应该怎么选择?
从性能的角度考虑,你选择唯一索引还是普通索引呢?查询分析:由于是用的B+树,从树根找到叶子节点,也就是数据页,数据页内使用二分法来定位记录普通索引:找到满足条件的记录,继续向下查,知道碰到不满足条件的记录唯一索引:找到一个满足条件的记录,停止检索由于InnoDB的数据是按数据页来读写的,也就是说读取时是将一页数据读取进内存,数据页默认大小是16kb,所以在数据唯一的情况下,普通索引也就多做了一次判断,只需要一次寻址和计算。除非是在不同数据页中,操作会复杂些,但是对于整型字段,一个数据原创 2022-01-10 01:46:19 · 370 阅读 · 0 评论 -
08 | 事务到底是隔离的还是不隔离的?MVCC
思考:首先,事务在可重复读的隔离级别下,同一事务读的值不会改变,那么在发生行锁竞争等待中,别的事务进行了数据修改,结果如何?此处Q1读到的值是3,而Q2读到的值是1原因:主要是因为mvcc(多版本并发控制)mvcc基本概念:undo log:记录数据库的操作版本链:存储的记录中除了本身数据,还有两个字段trx_id(事务id,自增),roll_pointer(回滚指针),回滚指针形成版本链readview: 快照,在版本链中找到合适的版本假设: 1. 事务 A 开始前原创 2022-01-09 00:32:28 · 293 阅读 · 0 评论 -
07行锁功过:怎么减少行锁对性能的影响?
行锁是由引擎层实现,MyISAM不支持,InnoDB支持,行锁可以提高并发度两阶段锁说起:两阶段锁协议:InnoDB事务中,行锁在需要的时候才添加,并不是不需要的时候释放,而是在事务提交时才释放因此假如事务中需要锁多个行,要把最可能出现锁冲突的锁放在最后,因为这样可以减少锁等待的时间,提高并发度这样解决了行锁占用时间过长的问题,但是还是有可能发生死锁?死锁构建:事务A 需要id =1 和2 的锁 ,事务B需要id=2 和1 的锁 ,事务A拿到1的锁等待2的锁,事务B拿到2的锁等待1的锁原创 2022-01-08 20:34:09 · 283 阅读 · 0 评论 -
06-全局锁和表锁
全局锁:就是对整个数据库实例加锁全局读锁命令:flush tables with read lock数据库全局读锁情况下,其他操作都不可以使用场景:全库逻辑备份若全库逻辑备份中不加全局锁,可能导致数据不正常Mysql自带逻辑备份工具mysqldump,使用single-transaction参数,导数据之前会开启一个事务,保证拿到一致性视图,又因为mvcc的支持,整个过程可以进行数据更新。一致性读这么好,为什么还要全局读锁?一致性视图要求支持事务和特定的隔离级别,对于不支持事务.原创 2022-01-06 01:13:52 · 510 阅读 · 0 评论