数据库
文章平均质量分 94
nanchengyu
这个作者很懒,什么都没留下…
展开
-
MySQL中like查询是否会使用索引
MySQL中like查询使用索引explain查看执行计划实验过程Like 不走索引的优化explain查看执行计划首先介绍一下mysql explain的各项内容:序号名称含义备注1id查询的IDID相同从上往下执行,ID不同,越大越先执行2select_type查询类型SIMPLE 简单查询 PRIMARY 最外层的查询Union SUBQUERY 子查询。还有很多类型可以看官方文档 https://dev.mysql.com/doc/refman/5.6原创 2021-02-24 15:53:51 · 2979 阅读 · 0 评论 -
MySQL并行复制策略详解
之前提到过,当备库执行大事务的时候可能会造成主从延迟,除此之外,当从库的binlog执行能力小于主库的时候,也会造成延迟。所以我们需要尽可能的让从库的执行采用并发的方式。 在主库上,事务之间通过各种锁来控制并发执行的过程,在从库上,官方5.6版本之前,MySQL只支持单线程复制。由此在主库并发高、TPS高时就会出现严重的主备延迟问题。如果需要采用多线程进行复制,则要最重要的是解决如何分发任务的问题。采用轮询方式无法严格控制worker的执行次序(也就是被CPU调度的顺序),可能会发生数据不一致的问题原创 2020-06-14 16:13:08 · 381 阅读 · 0 评论 -
MySQL高可用机制分析
主从复制的过程如下: 主库执行事务记录binlog,然后将binlog发送到从库,最后从库执行这个binlog。 主从延迟时间可以在从库上使用show slave status进行查询 主从延迟的主要原因: 1. 从库机器的性能本来就比主库差 2. 备库压力过大 3. 存在大事务 主备切换可靠性优先策略执行过程: 1. 判断备库B现在的seconds_behind_master,如果小于某个值(比如5秒)继续下一步,否则持续重试这一步; 2原创 2020-06-06 21:34:49 · 157 阅读 · 0 评论 -
MySQL主从一致原理
MySQL主从一致原理MySQL主从同步过程binlog日志格式参考文献MySQL主从同步过程 一般MySQL的备库会设置成read-only,以避免发生数据不一致等情况,注意这个read-only对于超级用户无效(binlog可以正常执行),事务日志同步的过程如下:在备库B上通过change master命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。在备库B上执行start slave命令,这时候备库会启动两个线程,分别为io原创 2020-05-30 19:46:56 · 272 阅读 · 0 评论 -
MySQL如何保证数据不丢
MySQL如何保证数据不丢Binlog写入机制Redo log写入机制组提交技术Binlog的格式Binlog写入机制 事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。系统给binlog cache分配了一片内存,每个线程一个,参数 binlog_cache_size用于控制单个线程内binlog cache所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。 Binlog的写入有两个阶段: 1. write,原创 2020-05-23 09:38:35 · 232 阅读 · 0 评论 -
MySQL数据库临时提高性能的方法
MySQL数据库临时提高性能的方法短连接风暴慢查询问题参考文献短连接风暴 连接数量超过max_connections时,新来的连接会被拒绝。这时有一些临时解决办法(注意这些办法都是有损的)kill掉那些占用连接但未进行事务操作的线程,注意如果数据库端主动断开连接,客户端是不能立刻感知的。让数据库建立连接时跳过权限验证阶段,重启数据库,并使用–skip-grant-tables参数启动,注意这样对于存在外网IP的数据库是十分危险的慢查询问题索引没设计好 这时可以用online DDL增加原创 2020-05-13 09:34:28 · 163 阅读 · 0 评论 -
MySQL锁与间隙锁
首先MySQL引入间隙锁是为了解决幻读的问题。间隙锁之间并不产生冲突,但间隙锁与插入数据之间会产生冲突。间隙锁的引入,可能会导致同样的语句锁住更大的范围,影响并发度。MySQL加锁的规则十分复杂并且随着版本更新进行变动,整体的加锁规则如下,包含了两个“原则”、两个“优化”和一个“bug”(所有都是在可重复读的隔离级别) 原则1:加锁的基本单位是next-key lock,next-key lock是前开后闭区间。 原则2:查找过程中访问到的对象才会加锁。 优化1:索引上的等值查询,给唯一索引原创 2020-05-11 10:06:28 · 525 阅读 · 2 评论 -
MySQL查询何时会被阻塞
MySQL查询何时会被阻塞由于没有拿到MDL读锁 可以通过show processlist命令查看线程状态为:Waiting for table metadata lock,这时需要找到锁住这个表的线程,通过select blocking_pid from sys.schema_table_lock_waits,然后kill掉对应的线程即可。被flush阻塞 这时show proce...原创 2020-05-06 10:34:36 · 715 阅读 · 0 评论 -
MySQL中如何优雅的随机取出数据
MySQL中如何优雅的随机取出数据方法一方法二参考文献 很多时候可能会涉及到随机从数据表中取出几条记录,例如单词APP锁屏显示单词这种,这个功能的实现方法有很多方法一 通过MySQL的order by rand()来实现。 如:select word from words order by rand() limit 3;使用explain对语句进行解析,可以看到Using tempo...原创 2020-04-25 09:33:15 · 2775 阅读 · 1 评论 -
MySQL order by工作机制
当使用order by对查询结果进行排序时,MySQL会给每个线程分配一块儿内存sort_buffer用于排序,在使用索引的情况下,整个的排序过程如下所述: 1. 初始化sort_buffer,确定放入结果中所需的字段; 2. 从索引中找到第一个满足条件主键id; 3. 到主键id索引取出整行,取所需字段的值,存入sort_buffer中; 4. 从索引中取下一个记录的主键id...原创 2020-04-24 10:38:14 · 264 阅读 · 0 评论 -
MySQL日志与索引QA
首先再明确一下MySQL的两阶段提交过程,如下图所示: 如果在时刻1 数据库宕机,则将事务回滚 如果在时刻2 数据库宕机,则如果binlog 已经完整写好,则提交事务;否则回滚事务。 Binlog存在固定的完整格式,statement格式的binlog,最后会有COMMIT;row格式的binlog,最后会有一个XID event,除此之外,还有check sum来进行内容校验。而...原创 2020-04-23 09:48:18 · 146 阅读 · 0 评论 -
MySQL count(*)详解
MySQL count(*)详解count实现原理不同count的性能区别参考文献count实现原理 与其他的功能类似,count(*)的实现方式也与MySQL存储引擎紧密相关,MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;而InnoDB引擎每次都需要把数据一行一行地从引擎里面读出来,然后累积计数,因为InnoDB存在MVCC机制,所...原创 2020-04-22 09:26:08 · 2236 阅读 · 0 评论 -
MySQL表空间回收
MySQL表空间回收表空间分析数据删除流程online与inplace的区别optimize table、analyze table和alter table这三种方式重建表的区别参考文献表空间分析 表删掉了一半的数据,表文件的大小还是没变,这背后的原因是什么呢? 首先本文的全部分析依赖于InnoDB存储引擎,一个InnoDB表包含两部分,即:表结构定义和数据。表数据既可以存在共享表空间里...原创 2020-04-21 09:56:50 · 537 阅读 · 0 评论 -
MySQL抖动原因分析
MySQL抖动原因分析数据库抖动定义InnoDB刷脏页控制策略参考文献数据库抖动定义 一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短,这样的情况我们一般称为数据库抖动。 我们知道,与操作系统概念类似,当内存数据页与磁盘数据页内容不一致的时候,则将内存数据页称为脏页,将脏页写回磁盘的过程称为flush...原创 2020-04-20 09:46:55 · 1209 阅读 · 0 评论 -
MySQL索引选择问题
在进行数据查询的时候,MySQL优化器会自动为查询语句选择合适的索引,索引选择的正确与否对MySQL的执行速度有很大影响。使用explain语句可以查询得到执行计划的详细内容,而优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的CPU资源越少,当然除了扫描行数之外也有其他...原创 2020-04-18 10:10:05 · 244 阅读 · 0 评论 -
MySQL普通索引与唯一索引
MySQL普通索引与唯一索引查询语句性能分析更新语句性能分析change buffer总结参考文献 当我们需要在一个唯一字段上建立索引时,究竟是建立普通索引还是唯一索引的性能更好呢?这时需要从两个角度考虑查询语句性能分析 对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录。 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的...原创 2020-04-17 10:50:59 · 366 阅读 · 0 评论 -
MySQL MVCC机制详解
MySQL MVCC机制详解MVCC分析参考文献MVCC分析 MySQL默认的事务隔离级别是可重复读,在事务开始时获得一致性视图,但更新数据时需要拿到行锁,如果与其他事务出现冲突需要进行等待,等待后获得锁再进行更新操作时读到的值是最新值还是创建一致性视图时的值呢?下面我们通过一个实验来验证。 下面为一张表的创建语句:mysql> CREATE TABLE `t` ( `id`...原创 2020-04-16 10:12:55 · 259 阅读 · 0 评论 -
MySQL行锁及其性能优化
MySQL行锁及其性能优化行锁死锁与死锁检测参考文献行锁 行锁针对数据表中行记录的锁,需要存储引擎支持,MyISAM不支持,InooDB支持, 在InnoDB事务中,行锁在需要时才加上,但并不是不需要了就立刻释放,而是要等到事务结束时才释放,所以如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放,以减少对性能的损耗。死锁与死锁检测 MySQL中处理死锁有两...原创 2020-04-15 09:24:02 · 615 阅读 · 0 评论 -
MySQL全局锁和表锁
MySQL全局锁和表锁全局锁表锁参考文献全局锁 对整个数据库加锁,语句为:Flush tables with read lock (FTWRL),加锁之后不可以进行增删改,也不能做DDL,是一个整库只读的状态,一般只有在做全库逻辑备份时才需要全局锁。可以看到,如果采用这种方式对库加锁的话,虽然保证了一致性,但十分影响业务。所以,应该尽量少采用这种方法,在数据的隔离级别中,可重复读也保证了在一...原创 2020-04-14 09:56:33 · 143 阅读 · 0 评论 -
MySQL索引
MySQL索引索引概念索引覆盖最左前缀索引下推参考文献索引概念 索引的概念如同书籍中的目录,是为了提高数据的读写效率,在MySQL中,索引是在存储引擎层面实现的。索引之所以可以加快读写速度是因为数据模型的优秀,常见的用于索引的数据模型有三种:哈希表、有序数组、搜索树。 哈希表将数据按照K-V的模式存储,整体是无序的,所以只适用于等值查找,无法进行MySQL中常见的区域查找,常用于Memc...原创 2020-04-11 11:26:48 · 90 阅读 · 0 评论 -
MySQL事务隔离
MySQL事务隔离基础知识实现事务启动长事务参考文献基础知识 事务简单来说,就是保证一组数据库操作要么全部成功,要么全部失败。MySQL中,在引擎层实现事务支持,其中InnoDB支持事务,MyISAM不支持事务。在InnoDB中提供四种隔离级别从低到高为:读未提交、读已提交、可重复读、串行。随着隔离级别的提高,事务执行的效率会降低。不同数据库的默认隔离级别并不相同,Oracle默认的隔离级别...原创 2020-04-10 08:48:25 · 95 阅读 · 0 评论 -
MySQL的Redo log与binlog
MySQL的Redo log与binlogRedo logbinlog总结Redo log 又称为重做日志。我们知道数据库中更新数据需要访问磁盘IO并精确找到所在的行进行操作,这一过程耗时较长,对于用户来说体验很差,MySQL采用Redo log的方式对此进行了优化,将更新操作先记录在Redo log中,然后等到合适的时机再将操作刷到磁盘中去。这种优化又称为WLA:Write-Ahead L...原创 2020-04-09 09:32:21 · 115 阅读 · 0 评论 -
MySQL基础架构
MySQL基础架构总体介绍模块介绍连接器查询缓存分析器优化执行器参考文献总体介绍 MySQL基础的架构图如下图所示,主要分为Server和存储引擎两部分。其中Server部分负责大部分核心功能,实现跨存储引擎的存储过程等,此外,常见的内置函数也都在Server的部分负责实现。而存储引擎的部分负责数据存储与提取,是可插拔的,常见的存储引擎包括Inno...原创 2020-04-08 10:47:41 · 122 阅读 · 0 评论 -
索引知识小结
1.索引是什么在表的数据量比较大时,查询操作比较耗时,建立索引是加快查询速度的有效手段,类似于图书后面的索引,可快速定位到要查询的内容。在关系数据库中,索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。2.索引的类型可以在数据库设计器中创建四种索引:普通索引、唯一索引、主键索原创 2016-10-15 11:12:28 · 276 阅读 · 0 评论