随笔分类 - MySQL实战45讲
极客时间笔记
摘要:主从有MS结构和双M结构 双M结构用serverId来判断是否自己的binlog,解决死循环问题。
阅读全文
摘要:bin_log的写入机制 binlog 的写入逻辑比较简单: 事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。 一个事务的 binlog 是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。 这就涉及到了 bi
阅读全文
摘要:这章没怎么搞明白 mysql有间隙锁, 带索引的好像只锁一个范围,但是不带索引的会锁这个表,没怎么搞明白,待研究。
阅读全文
摘要:你看到了,session A 先用 start transaction with consistent snapshot 命令启动了一个事务,之后 session B 才开始执行 update 语句。session B 执行完 100 万次 update 语句后,id=1 这一行处于什么状态呢?你可
阅读全文
摘要:对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。 mysql> select count(*) from tradelog where month(t_modified)=7; 这条语句需要走全索引扫描 select * from tradelog where id
阅读全文
摘要:select word from words order by rand() limit 3; 这条语句会扫描2count(*)+3行,执行如下:这里用到了内存临时表 set tmp_table_size=1024; set sort_buffer_size=32768; set max_lengt
阅读全文
摘要:MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。 select city,name,age from t where city='杭州' order by name limit 1000 ; 通常情况下,这个语句执行流程如下所示 : 初始化 sort_buffer,确定放
阅读全文
摘要:崩溃恢复时的判断规则。 如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交; 如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:a. 如果是,则提交事务;b. 否则,回滚事务。
阅读全文
摘要:对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数。 InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。所以,普通索引树比主键索引树小很多。 对于 count(*) 这样的操作,遍
阅读全文
摘要:delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。 也就是说,通过 delete 命令是不能回收表空间的。 这些可以复用,而没有被使用的空间,看起来就像是“空洞”。 不止是删除数据会造成空洞,插入数据也会。如果数据是按照索引递增顺序插入的,那么索引是紧
阅读全文
摘要:第一种是“redo log 写满了,要 flush 脏页”,这种情况是 InnoDB 要尽量避免的。因为出现这种情况的时候,整个系统就不能再接受更新了,所有的更新都必须堵住。如果你从监控上看,这时候更新数会跌为 0。第二种是“内存不够用了,要先将脏页写到磁盘”,这种情况其实是常态。InnoDB 用缓
阅读全文
摘要:使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。 于是,你就有个问题:当要给字符串创建前缀索引时,有什么方法能够确定我应该使用多长的前缀呢? 实际上,我们在建立索引时关注的是区分度,区分度越高越好。 因为区分度越高,意味着重复的键值越少。 因此,我们可以通过统计索引上有
阅读全文
摘要:如果使用索引 a,每次从索引 a 上拿到一个值,都要回到主键索引上查出整行数据,这个代价优化器也要算进去的。 而如果选择扫描 10 万行,是直接在主键索引上扫描的,没有额外的代价。 优化器会估算这两个选择的代价,从结果看来,优化器认为直接扫描主键索引更快。 当然,从执行时间看来,这个选择并不是最优的
阅读全文
摘要:选择普通索引还是唯一索引? 对于查询过程来说: a、普通索引,查到满足条件的第一个记录后,继续查找下一个记录,知道第一个不满足条件的记录 b、唯一索引,由于索引唯一性,查到第一个满足条件的记录后,停止检索 但是,两者的性能差距微乎其微。因为InnoDB根据数据页来读写的。 对于更新过程来说: 概念:
阅读全文
摘要:InnoDB 的行数据有多个版本,每个数据版本有自己的 row trx_id,每个事务或者语句有自己的一致性视图。普通查询语句是一致性读,一致性读会根据 row trx_id 和一致性视图确定数据版本的可见性。对于可重复读,查询只承认在事务启动前就已经提交完成的数据;对于读提交,查询只承认在语句启动
阅读全文
摘要:mysql5.7出现死锁时,导致死锁的那个事务会回滚,被死锁的事务正常获取锁。 ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction 发起死锁检测,发现死锁后,主动回滚死锁链条中的
阅读全文
摘要:给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。在对大表操作的时候,你肯定会特别小心,以免对线上服务造成影响。 FTWRL 前有读写的话 ,FTWRL 都会等待 读写执行完毕后才执行 FTWRL 执行的时候要刷脏页的数据到磁盘,因为要保持数据的一致性 ,理解的执行FTWRL时候是 所有
阅读全文

浙公网安备 33010602011771号