MySQL
Pennhhe
对时间有耐心
展开
-
如何统计数据库的数据数量
如何统计数据库的数据数量1. count(*)在统计一个表行数的时候,我们一般会使用 select count(*) from t。那么count(*) 是如何实现的呢?1.1 MyISAM在MyISAM引擎中,会把表的总行数存在磁盘上,需要的时候,直接返回即可。但是如果是加上了where 条件,就会逐行扫描,计算行数。1.2 InnoDB在InnnoDB中,需要把数据一行行的读出来,累计计数。1.3 为什么InnoDB 不跟MyISAM一样把数据存起来?因为InnoDB支持事务,由于MVC原创 2020-11-30 08:26:17 · 16206 阅读 · 0 评论 -
你的MySQL会抖动吗
你的MySQL会抖动吗1. 什么是MySQL 抖动一条SQL语句正常执行的时候特别快,有时候会变得特别慢。但是这种场景不是很常见。2. MySQL 为什么会抖动2.1 脏页内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存为脏页。2.2 干净页内存数据写入到磁盘后,内存和磁盘上的数据页的内容一致,称为干净页。2.3 对于抖动的解释执行较快的更新操作,其实是在写内存,MySQL抖动的瞬间,是在刷脏页,即把脏页的数据写入磁盘(该过程也叫flush)。2.4 什么时候会触发flush操作原创 2020-11-30 08:23:11 · 127 阅读 · 0 评论 -
MySQL 百问百答 之 事务隔离
MySQL 百问百答 之 事务隔离1. MySQL 中的视图view 查询语句定义的虚拟表,在调用的时候执行查询语句并生成语句。InnoDB实现MVCC 用的一致性读视图。2. 快照在MVCC里是怎么工作的2.1 什么是快照在可重复读隔离级别下,事务在启动的时候就拍了快照,这个快照基于整个库。2.2 快照如何实现InnoDB中每个事务有一个唯一的事务ID,transaction id,在事务开始的时候申请,严格递增。每行数据有多个版本,事务更新数据的时候,会生成新版本,并把事原创 2020-10-24 15:42:08 · 85 阅读 · 0 评论 -
如何减少行锁对性能的影响
如何减少行锁对性能的影响1. 什么是行锁行锁是针对数据表中的行记录进行加锁。2. 两阶段锁InnoDB中会在需要的时候加上行锁,不是使用完立即释放,而是等待事务结束才释放,这就是两阶段锁。3. 死锁并发系统中,多个线程有循环资源依赖,导致进入无限等待状态,就是死锁。3.1 死锁的处理策略超时释放。设置参数 innodb_lock_wait_timeout死锁检测,发现死锁后,主动回滚死锁链条中的一个事务。讲innodb_deadlock_detect 设置为on4. 如何解决热点行更原创 2020-10-24 15:38:20 · 345 阅读 · 0 评论 -
事务中的当前读
事务中的当前读1. 当前读更新数据都是先读后写,读的时候只能读当前的值,成为当前读。2. 更新中的当前读事务B 的事务ID 为101, 事务C的事务ID为102行数据x 在版本90的时候为(1,1)((主键Id,k))。2.1 事务B 执行 get k 的时候的值应该为多少应该为 (1,3)。原因在于:事务B更新k 的时候不能在版本90上更新,而应该在行数据x的当前版本上更新,否则事务C对于行数据x的更新就会丢失。事务B执行更新操作的时候,当前拿到的行数据x的值是(1,2),版原创 2020-10-24 15:36:51 · 931 阅读 · 0 评论 -
唯一索引,普通索引如何抉择
唯一索引,普通索引如何抉择1. 什么是唯一索引UNIQUE 唯一索引,不允许重复。2. 什么是普通索引INDEX 普通索引,允许重复。3. 数据库查询过程中普通索引和唯一索引的区别比如 select id from T where k=53.1 在k上建立普通索引在查找的过程中,找到第一个满足 k=5的记录后,需要查询下一个记录,知道遇到第一个不满足k=5的记录。3.2 在k上建立唯一索引唯一索引表示索引是唯一的,因此找到第一个满足k=5的记录后,就停止查找。3.3 对比普通索引和原创 2020-10-24 15:33:20 · 236 阅读 · 0 评论 -
索引 2
索引1. 回表回到主键索引树搜索的过程,称为回表。2. 什么时候会回表要查询的数据,在非主键索引中不包含时,需要回到主键索引,查询数据。3. 什么是覆盖索引要查询的数据,索引已经覆盖了该数据,不需要回到主键索引。例如,select ID from T where k between 3 and 5. 表T在主键ID以及k上有索引。上述的查询在k索引中能获取到主键ID,不需要回表。4. 什么时候需要使用联合索引如果有一个高频的需求,需要某两列的信息,比如 根据身份证号查询姓名,此时使用(身原创 2020-10-12 08:29:39 · 138 阅读 · 0 评论 -
数据库索引
数据库索引索引就像书的目录一样,为了提高查询的效率。1. 常见的索引模型1.1 哈希表哈希表用k-v存储数据,输入key就可以找到value。哈希冲突的常用解决方案就是链表。哈希表适用于只有等值查询的场景,即只根据key相等查询。1.2 有序数组有序数组适用于静态存储引擎。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WBq1Sgw-1602400808466)(media/16023985161194/16023991997174.jpg)]1.3 N原创 2020-10-11 15:21:05 · 101 阅读 · 0 评论 -
事务隔离
事务隔离1. 什么是事务事务要保证一组数据库操作,要么全成功,要么全失败。MySQL MyISAM引擎不支持事务,InnoDB支持。2. 事务的特性A Atomicity 原子性C Consistency 一致性I Isolation 隔离性D Durability 持久性3. 多个事务同时执行的问题脏读不可重复读幻读4. 隔离级别隔离的越严实,效率越低,因此要找一个平衡点。SQL的隔离级别有:读未提交 一个事务没有提交,它所做的变更就能被别的事务看到。读提交原创 2020-10-11 15:19:55 · 435 阅读 · 0 评论 -
2. SQL 更新语句如何执行
1. 重要的日志模块 redo logWAL,Write-Ahead Logging, 先写日志,再写磁盘。具体的话,当有一条记录要更新的时候,InnoDB引擎会先把记录写到redo log 里面,并更新内存。同时在系统空闲的时候,将这个操作记录更新到磁盘里。有了redo log ,InnoDB 可以保证数据库发生异常重启,之前提交的记录都不丢失,这个能力称为crash-safe。redolog 是InnoDB引擎的特有日志。2. 重要的日志模块 binlogServer层也有自己的日志,binl原创 2020-10-08 14:57:17 · 204 阅读 · 1 评论 -
1. SQL 查询语句如何执行
1. MySQL 的基本架构图MySQL 可以分为Server曾和存储引擎层两部分:Server 层包括连接器、查询缓存、分析器、优化器、执行器等,内置函数,所有跨存储引擎的功能(存储过程,触发器,视图)存储引擎层负责数据的存储和提取,结构模式是插件式,支持InnoDB,MyISAM,Memory。2. MySQL各个部分2.1 连接器连接器负责客户跟客户端建立连接,获取权限,维持和管理连接。2.2 查询缓存之前的查询语句及其结果可能会以key-value的形式缓存在内存中。缓存弊原创 2020-10-08 14:24:15 · 175 阅读 · 1 评论