MySQL
MySQL
qq_34709713
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
mysql之mysql数据在磁盘的储存方式
mysql的数据在磁盘上的存储:数据块:由多个磁盘block组成的块,存储引擎负责管理数据块。 磁盘是block块设备,数据在磁盘上的存放也是按照块存放的。 mysql读取表到内存的时候,也必许按照一块一块的方式读取。假设要查询的表在和其他表在都在同一个块内。加载块的时候除了读取要查询的表,其他表也一并被读取出来。 当一个块内的部分表被删除时,这是就是形成了碎片。这样会降低装载到内存的速度。 所以会生成一个块头,记录一个快内表的大小,有无空闲空间,空闲空间的位置。原创 2020-11-11 10:09:27 · 1063 阅读 · 0 评论 -
能不能使用join语句?
如果可以使用 Index Nested-Loop Join 算法,也就是说可以用上被驱动表上的索引,其实是没问题的;如果使用 Block Nested-Loop Join 算法,扫描行数就会过多。尤其是在大表上的 join操作,这样可能要扫描被驱动表很多次,会占用大量的系统资源。所以这种 join 尽量不要用。所以你在判断要不要使用 join 语句时,就是看 explain 结果里面,Extra 字段里面有没有出现“Block Nested Loop”字样。在决定哪个表做驱动表的时候,应该是两个表.原创 2020-10-12 23:43:19 · 278 阅读 · 0 评论 -
读写分离-过期读的问题解决
强制走主库方案;sleep 方案;判断主备无延迟方案;配合 semi-sync 方案;等主库位点方案;等 GTID 方案。原创 2020-10-12 23:40:37 · 240 阅读 · 0 评论 -
MySQL怎么保证高可用
主备延迟即“同步延迟”。与数据同步有关的时间点主要包括以下三个:主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;之后传给备库 B,我们把备库 B 接收完这个 binlog 的时刻记为 T2;备库 B 执行完成这个事务,我们把这个时刻记为 T3。所谓主备延迟,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,也就是 T3-T1。你可以在备库上执行 show slave status 命令,它的返回结果里面会显示 seconds_behind_mast原创 2020-09-28 23:15:36 · 641 阅读 · 0 评论 -
MySQL主备原理
备库建议设置成只读(readonly)模式。这样做,有以下几个考虑:有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防止误操作;防止切换逻辑有 bug,比如切换过程中出现双写,造成主备不一致;可以用 readonly 状态,来判断节点的角色。备库设置成只读了,还怎么跟主库保持同步更新呢?readonly 设置对超级 (super) 权限用户是无效的,而用于同步更新的线程,就拥有超级权限。节点 A 到 B 这条线的内部流程是什么样的?一个事务日志同步的完整过程是这样的:在.原创 2020-09-28 22:51:58 · 840 阅读 · 0 评论 -
MySQL 是怎么保证数据不丢的?
binlog 的写入机制binlog 的写入逻辑比较简单:事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。系统给 binlog cache 分配了一片内存,每个线程一个,参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。图中的 write,指的就是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快。图中的 fsync,才是原创 2020-09-27 23:48:22 · 501 阅读 · 1 评论 -
业务高峰期临时性地提升一些性能。
短连接风暴第一种方法:先处理掉那些占着连接但是不工作的线程。第二种方法:减少连接过程的消耗。(风险极高,是我特别不建议使用的方案)慢查询性能问题在 MySQL 中,会引发性能问题的慢查询,大体有以下三种可能:索引没有设计好;SQL 语句没写好;MySQL 选错了索引。QPS 突增问题...原创 2020-09-27 23:17:14 · 265 阅读 · 0 评论 -
如何开启并查询慢日志
1、配置文件配置找到[mysqld],在其下面添加如下代码即可.slow_query_log=ONslow_query_log_file=/usr/local/mysql/var/localhost-slow.loglong_query_time=0log-queries-not-using-indexes = 1// 配置好后,重启mysql服务1.slow_query_log该配置项是决定是否开启慢日志查询功能,配置的值有ON或者OFF.2.slow_query_log_file该原创 2020-09-27 21:03:20 · 354 阅读 · 0 评论 -
什么是幻读,幻读会有什么问题
什么是幻读?幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。“幻读”做一个说明:在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在当前读下才会出现。第二次查看,发现被修改的“行”,不能称为幻读,幻读仅专指“新插入的行”。当前读:也叫即时读,就是忽略版本控制,读取最新的数据。幻读有什么问题?首先是语义上的是数据一致性的问题。如何解决幻读问题?读锁是行锁,无法解决幻读问题,因此引入间隙锁(GAP锁)间隙原创 2020-09-27 00:12:40 · 2578 阅读 · 1 评论 -
对索引字段做函数操作,会导致全索引遍历查找
对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。需要注意的是,优化器并不是要放弃使用这个索引。放弃了树搜索功能,优化器可以选择遍历主键索引,也可以选择遍历二级索引 ,优化器对比哪个索引更小,就会遍历哪个索引。那些是函数操作? mysql> select count(*) from tradelog where month(t_modified)=7;使用了month()函数因此,该语句就不会走树搜索,而是遍历索引。mysql> select * fr原创 2020-09-26 21:42:46 · 478 阅读 · 0 评论 -
order by排序是如何工作的?
Order By排序的方式全字段排序rowid 排序全字段排序初始化 sort_buffer,确定放入 name、city、age 这三个字段;从索引 city 找到第一个满足 city='杭州’条件的主键 id,也就是图中的 ID_X;到主键 id 索引取出整行,取 name、city、age 三个字段的值,存入 sort_buffer 中;从索引 city 取下一个记录的主键 id;重复步骤 3、4 直到 city 的值不满足查询条件为止,对应的主键 id 也就是图中的 ID_Y;原创 2020-09-25 23:07:00 · 307 阅读 · 0 评论 -
MySQL count()函数
count(*) 的实现方式不同的 MySQL 引擎中,count(*) 有不同的实现方式。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;而 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。为什么InnoDB不直接存储表的总行数?由于InnoDB支持事务,多版本并发控制(MVCC)的原因,InnoDB 表“应该返回多少行”也是不确定的缓存系统保存计数的缺点缓存系原创 2020-09-24 22:57:47 · 185 阅读 · 0 评论 -
MySQL数据库事务嵌套
一般情况下,整个Yii应用使用了同一个数据库连接,或者说是使用了单例。而在yii\db\Connection中,又对事务对象进行了缓存:class Connection extends Component{// 保存当前连接的有效Transaction对象private $_transaction;// 已经缓存有事务对象,且事务对象有效,则返回该事务对象// 否则返回nullpublic function getTransaction(){ return $this->_t原创 2020-09-24 22:36:04 · 431 阅读 · 0 评论 -
MySQL的脏页
什么是脏页?当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。什么是干净页?内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。什么情况下会刷脏页?第一种是“redo log写满了,要flush脏页” 整个系统就不能再接受更新了,所有的更新都必须堵住。第二种是“内存不够用了,要先将脏页写到磁盘” 这种情况是常态第三种是mysql空闲时候第四种是mysql正常关闭时候InnoDB 用缓冲池(buffer pool)管理内存,缓冲池中的内存页有三种状态原创 2020-09-22 22:28:32 · 578 阅读 · 0 评论 -
前缀索引使用注意
优点:节省存储空间。缺点:会增加扫描行数,并且不能使用覆盖索引,因为前缀索引存储的数据不够完整,需要回表查询。如果字段前面重复率高,后面重复率低,怎么设计索引?一、第一种方式是使用倒序存储使用reverse()函数,将数据倒叙存储二、使用hash算法再创建一个字段,用来存储hash计算后的数据值,前缀索引可以加到该字段中。怎么判断前缀索引的的最短长度多少合理?mysql> select count(distinct email) as L from SUser;该语句可以查出该字段原创 2020-09-22 21:46:01 · 413 阅读 · 0 评论 -
如何选择普通索引和唯一索引
1、从查询上来看普通索引和唯一索引的区别?唯一索引查到一条数据后会直接返回数据,而普通索引查到数据后会继续查找是否还有满足条件的索引。从查询的角度来看,普通索引和唯一索引的差距微乎其微。2、什么是change buffer当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然原创 2020-09-22 20:55:50 · 297 阅读 · 0 评论 -
事务可重复读是怎么实现的?
一、事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。二、begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动。第一种启动方式,一致性视图是在执行第一个快照读语句时创建的;第二种启动方式,一致性视图是在执行 start transaction with consistent snapshot 时创建的。三、在 My原创 2020-09-21 21:52:03 · 978 阅读 · 0 评论 -
全局锁和表锁和行级锁
全局锁1、根据加锁的返回,Mysql可以分为三类锁,全局锁,表锁,行级锁2、全局锁,命令Flush tables with read lock (FTWRL),使整个库都处于只读状态,典型的使用场景是做全库逻辑备份。3、mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。也可以达到全局锁的效果,因此,全局锁只适用于不支持事务的存储引擎,如果全库都支持事务,不建议使用全局锁原创 2020-09-19 19:00:50 · 365 阅读 · 1 评论 -
MySQL索引
1、索引的目的:提高查询效率2、实现索引的原理,数据结构。常见的三种数据结构哈希表、有序数组、搜索树(1)、哈希表哈希表是一种以键 - 值(key-value)存储数据的结构,不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表缺点:哈希表只适合做等值搜索,不适合做区间搜索(2)、有序数组有序数组在等值查询和范围查询场景中的性能就都非常优秀缺点:更新成本太高,新增数据后面的数据都需要后移。只适合静态存储引擎(3)、二叉搜索树原创 2020-09-18 00:06:47 · 112 阅读 · 0 评论 -
mysql事务
1、事务的特性:原子性、一致性、隔离性、持久性2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读不可重复读和幻读的区别:不可重复读指的是多次读取一条记录,发现该记录被修改过幻读指的是多次读取一个范围,发现记录增多或者减少。3、事务隔离级别:读未提交、读提交、可重复读、串行化可重复读使用视图实现的,每次开启事务的时候创建一个静态视图,串行化是用锁来实现的4、不同事务隔离级别的区别:读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到读提交:一个事务提交之后,它所做原创 2020-09-16 23:43:53 · 92 阅读 · 0 评论 -
redo log和 binlog
mysql执行update语句和执行select语句前面的流程都一样,到执行器的时候会涉及到两个日志模块,redo log和 binlog。redo log 和binlog配合就是Mysql经常提到WAL技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。一、redo log1、redo log叫重做日志/物理日志,只适用于InnoDb存储引擎。2、用来实现 crash-safe 能力。3、记录在内存中。4、redo log固定大小,循环记录,因此会原创 2020-09-16 00:10:22 · 226 阅读 · 0 评论 -
SQL查询语句执行过程
1、连接器管理连接,用户登录权限验证。(1)建立连接后,长时间没有后续操作,会变成空闲连接,超过一定时间后,连接器会断开连接,由参数wait_timeout控制,一般时长是8个小时。(2)连接分为长连接和短连接。长连接只连续的后续操作都是用同一个连接。短连接指执行完少数几个操作后就断开连接,下次查询需要重新建立连接。建立连接的过程比较复杂,尽量减少建立连接的动作,也就是尽量使用长连接。(代码中尽量使用sql将全部需要的数据查出后再处理,减少查询次数)(3)全部使用长连接会导致另一个问题出现,就是.原创 2020-09-15 23:17:05 · 255 阅读 · 0 评论 -
《MySQL高性能》------总结
第一章:MySQL架构MySQL服务器逻辑架构图:第一层:最上层的服务器不是MySql所独有的,大多数基于网络的客户端/服务器工具或者服务都有类似的系统。比如链接处理,授权认证,安全等等。第二层:大多数的MySql的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有的内置函数(例如:日期,时间,数学和加密函数等)。所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图。第三层:包含了存储引擎。存储引擎负责MySql中的数据存储和提取。服务器通过API和存储引擎进行通信,这些接口屏蔽原创 2020-07-16 14:35:59 · 260 阅读 · 0 评论 -
mysql锁
脏读:一个事务读取另一个事务未提交的问题不可重复读: 在同一事务中,两次读取同一数据,得到内容不同幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同mysql的默认的RR(允许重复度)隔离级别下,如何避免事务的安全问题?在mysql的innodb的引擎下,采用MVCC机制+锁 方式解决事务的安全问题,但在RR(允许重复读)的级别下没有完全解决幻读的问题.解决脏读 修改时加排他锁(写锁),直到事务提交后才释放,读取时加共享锁(读锁),其他事务只能读取,不能再有更新操作 。防止脏读。解决不可转载 2020-05-20 23:21:40 · 126 阅读 · 0 评论 -
B树,B-树和B+树的区别
B树即二叉搜索树:1.所有非叶子结点至多拥有两个儿子(Left和Right);2.所有结点存储一个关键字;3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;如:B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二转载 2020-05-18 00:31:45 · 311 阅读 · 0 评论 -
MySQL的锁机制 - 记录锁、间隙锁、临键锁
记录锁(Record Locks)记录锁是 封锁记录,记录锁也叫行锁,例如:SELECT * FROM `test` WHERE `id`=1 FOR UPDATE;它会在 id=1 的记录上加上记录锁,以阻止其他事务插入,更新,删除 id=1 这一行。记录锁、间隙锁、临键锁都是排它锁,而记录锁的使用方法跟之前的一篇文章 共享/排它锁 里的排它锁介绍一致,这里就不详细多讲。间隙锁(Ga...转载 2020-04-15 20:10:59 · 1280 阅读 · 0 评论
分享