
MySQL
MySQL
リュウセイリョウ
这个作者很懒,什么都没留下…
展开
-
MySQL基础架构分析
1、MySQL的组成结构。MySQL主要可以分为两层,server层和存储引擎层。Server层包括连接器connector、(查询缓存)、分析器parser、优化器optimizer、执行器executor等,以及内置函数(如日期、时间、数学和加密函数等),还有存储过程procedure、触发器trigger、视图view等跨存储引擎功能的实现。引擎层负责数据的存储和查询提取,可插拔架构,最常用的引擎是InnoDB(并且是mysql5.5.5版本开始的默认存储引擎),其他引擎还有MyISAM和mem原创 2020-06-19 20:11:17 · 218 阅读 · 0 评论 -
MySQL日志模块
1、MySQL重要日志模块:redo log(事务日志)MySQL中有一个重要的技术叫WAL(Write-Ahead Logging),意思是写入数据之前先写日志。当有一条update语句需要执行的时候,InnoDB引擎会先把修改的记录写到redo log中,并将数据的变更写入内存中的Page Pool中,不用每次都把修改的数据写入磁盘。InnoDB的后台线程会按照一定的规则将内存中的脏页写入磁盘,落盘后记录下来当前redo log中有多少update日志已经实际存储到磁盘数据文件中了。redo log原创 2020-06-19 23:26:54 · 226 阅读 · 0 评论 -
一文看懂MySQL事务隔离
1、什么是事务?事务可以看作是由一组操作指令构成的执行单位,不可分割。简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。MySQL中的InnoDB引擎支持事务。2、事务的四个特性原子性(Atomicity):事务内的所有指令,要么全部执行成功,要么全部执行失败。只要其中一个指令执行失败,数据就要回滚到开始执行第一条事务指令前的数据状态。一致性(Consistency):事务的执行使数据从一个一致性状态转换为另一个一致性状态,对于整个数据的完整性保持稳定。一致性与原子性密切相关。例如原创 2020-06-23 22:20:52 · 228 阅读 · 0 评论 -
MySQL索引实现和优化(一)
1、什么是索引?索引之于数据库,就好像目录之于书本。使用索引是为了提高数据查询的效率。在MySQL中,使用主键索引,可以快速定位到数据库表中的对应行。2、实现索引的方式(数据结构)①哈希表:是一种以键值(key-value)对存储的数据结构,输入一个key,通过哈希函数,可以确定一个位置,得到这个位置对应的value。缺点是,当多个key通过哈希运算确定的是哈希表中同一个位置,那么将发生冲突。一种解决办法是采用"拉链法",即将所有冲突对象用链表相连。一般来说,这个链表是采用头插或者尾插的方式增加对象的原创 2020-07-08 23:08:52 · 180 阅读 · 0 评论 -
MySQL索引优化(二)
1、选择唯一索引还是普通索引?唯一索引,即索引树中的每个元素都不相同,是惟一的。普通索引,即索引树中存在相同的元素。唯一索引因为要保证索引的唯一性,所以在每次更新过程中,都要先判断这个操作是否违反唯一性约束。那么就需要在更新前,把数据页读入内存进行判断,才可以做后续的更新操作。普通索引并没有唯一索引的限制,可以直接做更新操作,因此普通索引在更新过程中,可以不急着将数据页读入内存再做更新。InnoDB会将更新操作缓存在change buffer中,在下次查询需要访问这个数据页的时候,将数据页读入内存后原创 2020-07-13 21:23:28 · 172 阅读 · 0 评论 -
MySQL中大大小小的锁
1、MySQL中有哪几种锁?按照锁的粒度,可以划分为全局锁 > 表锁 > 行锁。全局锁:对整个数据库实例加锁。表级锁:MySQL中表级别的锁有两种,一种是表锁,一种是元数据锁(meta data lock, MDL)。行锁:InnoDB引擎可以实现行锁,而MyISAM引擎不支持行锁。2、全局锁加锁命令是Flush tables with read lock(FTWRL)。一个库被锁上之后,其他的业务更新将不能进行,包括增删改数据(DML)以及修改表结构(DDL)。在客户端(异常)断开原创 2020-07-13 23:04:42 · 200 阅读 · 0 评论 -
MySQL count(*)太慢怎么办
1、count(*)实现方式MyISAM引擎把表的总行数存在磁盘上,在没有where条件的时候,如果执行count(*),会直接返回这个数。InnoDB引擎在执行count(*)时,需要把数据一行一行地读出来,累积计数。这是由于InnoDB事务默认的隔离级别是可重复读,可重复读是通过多版本并发控制(MVCC)实现的,一个会话在执行count(*)的时候,要依次判断表中的每一行是否可见,可见的行进行累积计数。此外,InnoDB是索引组织表,普通索引树比主键索引树小很多,所以在进行count(*)时,优化器原创 2020-07-15 23:21:24 · 2474 阅读 · 0 评论 -
MySQL中order by的工作原理
1、全字段排序假设有查询语句:select city, name, age from t where city=‘杭州’ order by name limit 1000,且city上建立索引。MySQL为order by排序开辟的内存称为sort_buffer,如果要排序的数据量小于这块内存,则在内存中进行排序。在内存中排序过程:①初始化sort_buffer,放入name, city, age三个字段;②从索引city找到第一个满足city='杭州’条件的主键id;③从主键id索引取出整行,原创 2020-07-15 23:28:54 · 425 阅读 · 0 评论 -
MySQL中哪些情况会用不上索引
1、对where条件字段做了函数操作对索引字段做函数操作,可能会破坏索引值的有序性,比如where month(t_modified)=7表示选取月份为7月的记录,此时无法使用索引的快速定位功能,改为全索引扫描。因此,为了用上索引的快速定位能力,我们要尽量避免对条件字段的函数操作,改成基于字段本身的范围查询,改成where t_modified>=‘2020-7-1’ and t_modified<‘2020-8-1’。我们要保证where后面等号的左边不做任何操作,比如where id+1=原创 2020-07-16 23:26:33 · 336 阅读 · 0 评论 -
MySQL中 join or not join
1、驱动表和被驱动表SQL语句:select * from t1 straight_join t2 on (t1.a=t2.a),其中t1、t2结构相同,两表皆有主键id、字段a和字段b。执行过程中首先会从表t1中取一行R,从R中取得字段a再到表t2中取查找,取出满足条件的行,跟R组成一行,作为结果集返回。因此,表t1称为驱动表,表t2称为被驱动表。2、Index Nested-Loop Join以1中SQL语句为例,如果t2.a上建了索引,那就是Index Nested-Loop Join(简称NL原创 2020-07-21 10:46:50 · 1042 阅读 · 0 评论