★ MySQL 实战
文章平均质量分 94
对于 MySQL 要做到原理先行,再实践验证,本专栏笔记旨在激发我们对数据库原理的探索欲,从而更好地理解工作中遇到的问题,更能知道背后的为什么,欢迎一起交流探讨~
✦昨夜星辰✦
生活就像仰卧起坐,时而卷起,时而躺平。
展开
-
一条 SQL 查询语句是如何执行的?
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。原创 2019-11-19 22:34:09 · 320 阅读 · 0 评论 -
一条 SQL 更新语句是如何执行的?
MySQL 可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?原创 2019-11-20 22:34:00 · 468 阅读 · 0 评论 -
事务隔离:为什么你改了我还看不见?
当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。原创 2019-11-21 12:33:51 · 447 阅读 · 0 评论 -
深入浅出索引(上)
一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。原创 2019-11-22 10:38:37 · 436 阅读 · 0 评论 -
深入浅出索引(下)
普通索引查询,都是先查询出主键索引再根据主键索引查出内容数据。回到主键索引树搜索的过程称之为回表。原创 2019-11-26 09:57:36 · 368 阅读 · 0 评论 -
全局锁和表锁 :给表加个字段怎么有这么多阻碍?
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。 这篇文章主要来讨论下全局锁和表级锁。原创 2019-11-26 11:29:00 · 411 阅读 · 0 评论 -
行锁功过:怎么减少行锁对性能的影响?
行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。原创 2019-11-26 12:53:19 · 715 阅读 · 0 评论 -
事务到底是隔离的还是不隔离的?
可重复读的核心就是一致性读(consistent read);而事务更新数据的时候,只能用当前读。如果当前的记录的行锁被其他事务占用的话,就需要进入锁等待原创 2019-11-27 18:00:14 · 487 阅读 · 0 评论 -
普通索引和唯一索引,应该怎么选择?
当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。原创 2019-11-29 23:51:45 · 365 阅读 · 0 评论 -
MySQL 为什么有时候会选错索引?
优化器不仅会估算扫描行数,还会考虑普通索引还要进行回表操作,主键索引不需要回表,有些时候尽管主键索引的估算扫描行数多于普通索引,但是普通索引需要回表,所以优化器综合考虑用的还是主键索引。原创 2019-12-15 11:10:29 · 263 阅读 · 1 评论 -
怎么给字符串字段加索引?
直接创建完整索引,这样可能比较占用空间;创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引;倒序存储,再创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题;创建 hash 字段索引,查询性能稳定,有额外的存储和计算消耗,跟第三种方式一样,都不支持范围扫描。原创 2019-12-19 22:51:16 · 232 阅读 · 0 评论 -
为什么表数据删掉一半,表文件大小不变?
delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。也就是说,通过 delete 命令是不能回收表空间的。这些可以复用,而没有被使用的空间,看起来就像是“空洞”。原创 2019-12-08 12:32:56 · 585 阅读 · 0 评论 -
count(*) 这么慢,我该怎么办?
计数统计性能比较:count(字段) < count(主键 id) < count(1) ≈ count(*)原创 2019-12-08 21:26:49 · 361 阅读 · 0 评论 -
“order by”是怎么工作的?
如果 MySQL 实在是担心排序内存太小,会影响排序效率,才会采用 rowid 排序算法,这样排序过程中一次可以排序更多行,但是需要再回到原表去取数据。如果 MySQL 认为内存足够大,会优先选择全字段排序,把需要的字段都放到 sort_buffer 中,这样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。原创 2019-12-03 12:34:09 · 507 阅读 · 0 评论 -
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
对于 select * from tradelog where id + 1 = 10000 这个 SQL 语句,这个加 1 操作并不会改变有序性,但是 MySQL 优化器还是不能用 id 索引快速定位到 9999 这一行原创 2019-12-10 12:36:19 · 306 阅读 · 0 评论 -
为什么我只查一行的语句,也执行这么慢?
只查一行的语句,也执行这么慢,有可能是在等 MDL 元数据锁、等 flush、等行锁,来分析下~原创 2019-12-12 00:03:30 · 238 阅读 · 0 评论 -
幻读是什么,幻读有什么问题?
幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行原创 2019-12-14 17:56:58 · 1288 阅读 · 0 评论 -
MySQL 是怎么保证主备一致的?
binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致了呢?今天就正式地来介绍一下它。原创 2019-12-09 21:35:42 · 496 阅读 · 1 评论 -
MySQL 是怎么保证高可用的?
在一个主备关系中,每个备库接收主库的 binlog 并执行。正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。MySQL 要提供高可用能力,只有最终一致性是不够的。为什么这么说呢?今天就着重来分析一下。原创 2019-12-09 23:10:26 · 529 阅读 · 0 评论 -
读写分离有哪些坑?
带 proxy 的读写分离架构,对客户端比较友好。客户端不需要关注后端细节,连接维护、后端信息维护等工作,都是由 proxy 完成的。但这样的话,对后端维护团队的要求会更高。而且,proxy 也需要有高可用架构。因此,带 proxy 架构的整体就相对比较复杂原创 2019-12-11 23:21:16 · 637 阅读 · 0 评论 -
如何判断一个数据库是不是出问题了?
主备切换有两种场景,一种是主动切换,一种是被动切换。而其中被动切换,往往是因为主库出问题了,由 HA 系统发起的。原创 2019-12-12 21:43:19 · 596 阅读 · 0 评论 -
join 语句怎么优化?
BKA 优化是 MySQL 已经内置支持的,建议你默认使用;BNL 算法效率低,建议你都尽量转成 BKA 算法,优化的方向就是给被驱动表的关联字段加上索引;基于临时表的改进方案,对于能够提前过滤出小数据的 join 语句来说,效果还是很好的;MySQL 目前的版本还不支持 hash join,但你可以配合应用端自己模拟出来,理论上效果要好于临时表的方案。原创 2019-12-21 17:14:56 · 409 阅读 · 0 评论 -
如何设计一个关系型数据库
存储模块:逻辑关系转化成物理关系的存储管理缓存机制:优化执行效率SQL 解析:进行 SQL 语句的解析日志管理:记录操作日志权限划分:进行多用户管理的权限划分容灾机制:灾难恢复模块索引管理:优化数据查询效率锁管理:使得数据库支持并发操作原创 2020-01-08 21:59:40 · 664 阅读 · 0 评论 -
MySQL 实战总结篇
MySQL 中 MyISAM 与 InnoDB 的区别?事务的特性并发操作问题事务的隔离级别索引是什么?索引能干什么?有什么好处?原创 2020-02-27 16:17:11 · 1093 阅读 · 0 评论