![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL
m0_37039331
这个作者很懒,什么都没留下…
展开
-
MySQL---更新的时候发生了什么
MySQL更新的时候发生了什么?redo log(重做日志) WAL,关键点是先写日志,再写磁盘。当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到 redo log(粉板)里面,并更新内存,这个时候更新就算完成了。 redo log 是 InnoDB 引擎特有的日志。binlog(归档日志) Server层的日志,称为 binlog(归...原创 2019-04-25 20:19:41 · 113 阅读 · 0 评论 -
MySQL---一些问题
答疑:问题 1:执行一个 update 语句以后,我再去执行 hexdump 命令直接查看 ibd 文件内容,为什么没有看到数据有改变呢?回答:这可能是因为 WAL 机制的原因。update 语句执行完成后,InnoDB 只保证写完了 redo log、内存,可能还没来得及将数据写到磁盘。问题 2:为什么 binlog cache 是每个线程自己维护的,而 redo log buff...原创 2019-05-08 20:28:42 · 68 阅读 · 0 评论 -
MySQL---为什么这些SQL语句性能差异巨大?
为什么这些SQL语句性能差异巨大?案例一:条件字段函数操作 如果对字段做了函数计算,就用不上索引了,这是 MySQL 的规定。为什么? 对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。 函数操作,MySQL 无法再使用索引快速定位功能,而只能使用全索引扫描。案例二:隐式类型转换 数据类型转换的规则是什么? 在...原创 2019-05-06 19:57:01 · 166 阅读 · 0 评论 -
MySQL---为什么只查一行的语句,也执行这么慢?
为什么只查一行的语句,也执行这么慢?第一类:查询长时间不返回 一般都是首先执行一下 show processlist 命令,看看当前语句处于什么状态。 ①:等 MDL 锁 使用 show processlist 命令查看State有Waiting for table metadata lock 处理方式,就是找到谁持有 MDL 写锁,然后把它 ki...原创 2019-05-06 19:57:33 · 346 阅读 · 0 评论 -
MySQL---为什么锁这么多?
为什么我只改一行的语句,锁这么多?加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”。1.原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间。2.原则 2:查找过程中访问到的对象才会加锁。3.优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。4.优化 2:索引上的等值查询,向右遍历时...原创 2019-05-07 20:21:53 · 188 阅读 · 0 评论 -
MySQL--- 有哪些“饮鸩止渴”提高性能的方法?
MySQL有哪些“饮鸩止渴”提高性能的方法?短连接风暴 短连接模型存在一个风险,就是一旦数据库处理得慢一些,连接数就会暴涨。max_connections 参数,用来控制一个 MySQL 实例同时存在的连接数的上限,超过这个值,系统就会拒绝接下来的连接请求,并报错提示“Too many connections”。 第一种方法:先处理掉那些占着连接但是不工作的线程。 ...原创 2019-05-07 20:22:26 · 196 阅读 · 0 评论 -
MySQL是怎么保证主备一致的?
MySQL是怎么保证主备一致的?binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致了呢主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写 binlog。备库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个线程,专门用于服务备库 B 的这个长连接。一个事务日志同步的完整过程是这样的:1.在...原创 2019-05-10 20:26:26 · 166 阅读 · 0 评论 -
MYSQL 备库延迟问题
MYSQL 备库延迟问题一个线程负责客户端写入主库,另一线程sql_thread 执行中转日志(relay log)。在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。coordinator (sql_thread)在分发的时候,需要满足以下这两个基本要求:1.不能造成更新覆盖。这就要求更新同一行的两个事务,必须被...原创 2019-05-10 20:27:06 · 458 阅读 · 0 评论 -
MySQL读写分离有哪些坑?
读写分离有哪些坑?读写分离的主要目标就是分摊主库的压力。一种架构是客户端(client)主动做负载均衡,这种模式下一般会把数据库的连接信息放在客户端的连接层。也就是说,由客户端来选择后端数据库进行查询。一种架构是,在 MySQL 和客户端之间有一个中间代理层 proxy,客户端只连接 proxy, 由 proxy 根据请求类型和上下文决定请求的分发路由。客户端直连和带 proxy 的读写...原创 2019-05-11 19:05:21 · 1005 阅读 · 0 评论 -
MySQL之Join
MySQL join?使用 join 有什么问题呢?1.如果可以使用 Index Nested-Loop Join 算法,也就是说可以用上被驱动表上的索引,其实是没问题的;2.如果使用 Block Nested-Loop Join 算法,扫描行数就会过多。尤其是在大表上的 join 操作,这样可能要扫描被驱动表很多次,会占用大量的系统资源。所以这种 join 尽量不要用。所以你在判...原创 2019-05-12 12:21:48 · 94 阅读 · 0 评论 -
MySQL join 优化
join优化?回表是指,InnoDB 在普通索引 a 上查到主键 id 的值后,再根据一个个主键 id 的值到主键索引上去查整行数据的过程。回表是一行行搜索主键索引的。因为大多数的数据都是按照主键递增顺序插入得到的,所以我们可以认为,如果按照主键的递增顺序查询的话,对磁盘的读比较接近顺序读,能够提升读性能。这就是 MRR 优化的设计思路。MRR 能够提升性能的核心在于,这条查询语句在...原创 2019-05-12 12:22:29 · 308 阅读 · 0 评论 -
MySQL---怎么保证数据不丢?
MySQL怎么保证数据不丢?redo log 的写入流程是怎么样的,如何保证 redo log 真实地写入了磁盘 ?binlog的写入逻辑:事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。一个事务的binlog是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。系统给 binlog cache 分...原创 2019-05-08 20:27:58 · 200 阅读 · 0 评论 -
MySQL--- order by 是怎么工作的?
“order by”是怎么工作的?explain命令看语句的执行情况:Extra 这个字段中的“Using filesort”表示的就是需要排序,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。select city,name,age from t where city='杭州' order by name limit 1000 ;通常情况下,这个语句...原创 2019-05-05 21:34:01 · 265 阅读 · 0 评论 -
MySQL---事务的隔离
事务的隔离1.innodb支持RC和RR隔离级别实现是用的一致性视图(consistent read view)2.事务在启动时会拍一个快照,这个快照是基于整个库的.基于整个库的意思就是说一个事务内,整个库的修改对于该事务都是不可见的(对于快照读的情况)如果在事务内select t表,另外的事务执行了DDL t表,根据发生时间,要嘛锁住要嘛报错(参考第六章)3.事务是如何实现的...原创 2019-04-29 20:40:31 · 114 阅读 · 0 评论 -
MySQL---索引的选择
选择普通索引还是唯一索引?对于查询过程来说:a、普通索引,查到满足条件的第一个记录后,继续查找下一个记录,直到第一个不满足条件的记录b、唯一索引,由于索引唯一性,查到第一个满足条件的记录后,停止检索但是,两者的性能差距微乎其微。因为InnoDB根据数据页来读写的。对于更新过程来说:概念:change buffer当需要更新一个数据页,如果数据页在内存中就直接更新,如果不在内存...原创 2019-05-02 06:09:40 · 87 阅读 · 0 评论 -
MySQL---索引
1.mysql如何判断一个查询的扫描行数?根据统计信息来估算记录数。统计信息就是索引的“区分度”。一个索引上不同的值越多,这个索引的区分度就越好。2.索引基数如何计算?采样统计。InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。3.可以重新统计索引信息的命令是什么?analyze table t 命令,...原创 2019-05-02 06:12:25 · 73 阅读 · 0 评论 -
MySQL---字段加索引
怎么给字符串字段加索引?MySQL 是支持前缀索引的,也就是说,你可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。索引选取的越长,占用的磁盘空间就越大,相同的数据页能放下的索引值就越少,搜索的效率也就会越低。有没有什么办法既可以占用更小的空间,也能达到相同的查询效率?第一种方式是使用倒序存储。第二种方式是使用 hash ...原创 2019-05-02 06:24:11 · 170 阅读 · 0 评论 -
MySQL---事务
事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务的支持是在引擎层实现的。当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。读已提交:...原创 2019-04-27 16:11:52 · 79 阅读 · 0 评论 -
MySQL---索引
索引:提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。 哈希表这种结构适用于只有等值查询的场景。哈希做区间查询的速度是很慢的。 有序数组在等值查询和范围查询场景中的性能就都很好,局限是有序数组索引只适用于静态存储引擎。基于主键索引和普通索引的查询有什么区别?如果语句是 select * from T wher...原创 2019-04-27 16:13:04 · 83 阅读 · 0 评论 -
MySQL---删除时做了什么
1.delete操作会生成插入相同记录的记录复用和page复用2.delete会产生page空洞,随机insert也会产生page空洞(页分裂),索引update分解为delete和insert也会产生空洞3.重建表可以使数据在page上更紧凑4.alter table tb_name engine=innodb 在非online ddl 时server层生成临时表且mdl写锁,阻塞其他...原创 2019-05-03 14:01:15 · 114 阅读 · 0 评论 -
MySQL---Count
不同的 count 用法在 select count(?) from t 这样的查询语句里面,count(*)、count(主键 id)、count(字段) 和 count(1) 等不同用法的性能,有哪些差别。这里详细说明一下这几种用法的性能差别。需要注意的是,下面的讨论还是基于 InnoDB 引擎的。这里,首先你要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回...原创 2019-05-03 14:02:27 · 439 阅读 · 0 评论 -
MySQL---问题集锦
问题集锦:1:MySQL 怎么知道 binlog 是完整的?一个事务的 binlog 是有完整格式的:statement 格式的 binlog,最后会有 COMMIT;row 格式的 binlog,最后会有一个 XID event。在 MySQL 5.6.2 版本以后,还引入了 binlog-checksum 参数,用来验证 binlog 内容的正确性。对于 binlog 日志由于磁盘...原创 2019-05-04 10:33:43 · 89 阅读 · 0 评论 -
MySQL---概论
下面是MySQL 的基本架构示意图: server层: 连接器: 建立连接,假设你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限,只有再新建的连接才会使用新的权限设置。 查询缓存: MySQL 拿到一个查询请...原创 2019-04-24 20:56:40 · 112 阅读 · 0 评论 -
MySQL---锁
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁的典型使用场景是,做全库逻辑备份。 MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。 表...原创 2019-04-29 20:39:55 · 70 阅读 · 0 评论 -
MySQL之自增主键为什么不是连续的?
自增主键为什么不是连续的?在 MySQL 5.7 及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id)+1 作为这个表当前的自增值。在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值。在 MySQL 里面,如果字段 id 被定...原创 2019-06-09 09:28:57 · 1097 阅读 · 0 评论