MySQL
文章平均质量分 81
MySQLl实战45讲、高性能MySQL学习
Java Gosling
这个作者很懒,什么都没留下…
展开
-
MySQL---MRR策略和BKA算法
Multi-Range ReadMulti-Range Read简称MRR,其目的是尽量使用顺序读盘。对于SQLselect * from t1 where a>=1 and a<=100;其执行流程是:根据索引a,定位到满足条件的记录,将id值放入read_rnd_buffer中。将read_rnd_buffer中的id进行递增排序。排序后的id数组,依次到主键id索引中查记录,并作为结果返回。使用MRR的原因是随着a值的增加,id的值会变成随机的,随机访问的性能较差,但是多原创 2021-07-13 19:35:00 · 575 阅读 · 0 评论 -
MySQL---join驱动表的选择
文章目录join关键字IndexNested-Loop JoinBlock Nested-Loop Join小表的概念总结:join关键字当业务需要从多个数据表中读取数据时,可以使用SQL语句中的连接(JOIN),在两个或多个数据表中查询数据。JOIN 按照功能可分为三类:INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;LEFT JOIN(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录;RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于原创 2021-07-12 22:16:14 · 2672 阅读 · 2 评论 -
查询长时间不返回问题
文章目录1.MDL锁堵塞2.flush堵塞3.行锁堵塞1.MDL锁堵塞使用show processlist命令查看Waiting for table metadata lock的示意图。当出现waiting for table metadata lock的时候,说明是MDL写锁堵塞了。select blocking_pid from sys.schema_table_lock_waits获取blocking_pid。通过查询sys.schema_table_lock_waits这张表,我们就可以直原创 2021-07-12 21:33:15 · 220 阅读 · 0 评论 -
MySQL---count(*)的那些事
文章目录count(*)的实现方式不同的count用法平常计算一个表的行数,一条select count(*) from table搞定,但是随着系统中记录数越来越多,这条语句执行得也会越来越慢。count(*)的实现方式在不同的MySQL引擎中,count(*)有不同的实现方式。MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高。InnoDB引擎执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。今天说的是没原创 2021-07-10 21:36:33 · 139 阅读 · 0 评论 -
MySQL---脏页机制
文章目录flush和脏页flush触发条件InnoDB刷脏页的控制策略flush和脏页InnoDB在处理更新语句的时候,磁盘操作仅写了redo log日志,同时并更新内存,之后当系统空闲时会把操作记录更新到磁盘里,MySQL把内存里的数据写入磁盘的过程我们称为flush。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容一致,称为“干净页”。flush触发条件InnoDB redo log日志写满。此时系统会停止所有更新操作,把原创 2021-07-08 20:57:03 · 623 阅读 · 0 评论 -
MySQL---字符串字段“优雅”的加索引
文章目录字符串类型的字段在开发中很常见,但是如何优雅的给字符串字段添加索引呢?这里假如我们有一张表create table User(ID bigint unsigned primary key,id_card varchar(18),email varchar(64),...)engine=innodb;有一条SQL语句 select f1, f2 from User where email='xxx'; (f1、f2表示表中的两个字段),因为没有添加索引,此时走的肯定是全表扫描。我原创 2021-07-06 20:07:47 · 209 阅读 · 0 评论 -
MySQL---优化器优化的真与假
文章目录扫描行数的确定基数的确定索引错误选择如何避免索引选择错误?优化器,顾名思义是对将要做的事情进行优化以达到提升的效果。MySQL里的优化器是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的CPU资源越少。除了扫描行数,是否使用临时表、是否排序等也是优化器需要进行判断的因素。扫描行数的确定MySQL在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条,而只能根据统计信息来估算记录数原创 2021-07-05 20:47:42 · 212 阅读 · 0 评论 -
MySQL---全局锁、表级锁和行锁
文章目录全局锁表级锁表锁元数据锁MDL阻塞问题解决方法行锁死锁全局锁全局锁是对整个数据库实例加锁,当需要让整个数据库处于只读(read only)状态的时候,就可以使用全局锁,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句,全局锁操作命令是Flush tables with read lock(FTWRL)。全局锁的典型使用场景是做全库逻辑备份,也就是把整库每个表都select出来存成文本。但是通过全局锁做全局备份会有一个问原创 2021-07-04 22:19:12 · 226 阅读 · 0 评论 -
MySQL---普通索引VS唯一索引
文章目录普通索引和唯一索引两者如何选择?1.查询过程2.更新过程关键者 change bufferInnoDB更新流程:总结:普通索引和唯一索引普通索引是为了加快访问速度为某个字段建立的索引,被索引的数据列允许有重复的值。唯一索引和普通索引类似,但是被索引的数据列不允许包含重复的值。两者如何选择?1.查询过程SQLselect * from student where id = 1001;对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录为止。原创 2021-07-03 16:53:57 · 189 阅读 · 0 评论 -
MySQL---覆盖索引和联合索引
文章目录覆盖索引思考:是否可以使用联合索引?联合索引最左前缀原则思考:建立联合索引的时候,如何定义索引内的字段顺序。索引下推联合索引失效条件覆盖索引create table student(id int primary key,name varchar(10) NOT NULL,age int NOT NULL,gender int NOT NULL default 1)对于SQLselect * from student where age between 20 and 30;,执行流程原创 2021-07-01 20:43:09 · 1355 阅读 · 0 评论 -
MySQL---初识索引
文章目录索引常见模型1.哈希表2.有序数组3.搜索树InnoDB 的索引模型基于主键索引和普通索引的查询有什么区别?索引的维护使用 OR 不使用自增主键?索引(在MySQL里也叫做“键(key)”)是储存引擎用于快速找到记录的一种数据结构。这是索引的基本功能。—《高性能MySQL》第五章索引最根本的作用是提高查询效率,对于索引,简单的理解可以把它想成一个书的目录,当我们想查找某一个知识点的时候可以大大提高我们的查找速度。索引常见模型1.哈希表哈希表是以key-value结构来存储数据,但是为了原创 2021-06-30 20:41:21 · 157 阅读 · 0 评论 -
MySQL日志---redo log和binlog
文章目录MySQL更新操作redo logbinlogMySQL更新操作MySQL查询操作MySQL的更新操作和查询操作大体上一样,都需要经过连接器、分析器、优化器和执行器。有区别的是,在进行更新操作的时候,会有两个重要的日志板块-----redo log和binlog。redo logredo log通常将其翻译成重做日志(英文中的前缀re表示重复的意思),作为InnoDB特有的日志,它的作用是当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log中,同时并更新内存,之后当系原创 2021-06-29 22:00:18 · 271 阅读 · 0 评论 -
一条查询SQL是如何执行的
当我们执行一条SQL后表面会得到结果,但是你有没有想过内部会发生什么?接下来我们来探讨下。文章目录MySQL架构图Server层存储引擎层SQL执行顺序1.连接器2.查询缓存3.分析器4.优化器5.执行器MySQL架构图通常我们将MySQL分为Server层和存储引擎层两部分。Server层Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触.原创 2021-06-28 22:05:03 · 156 阅读 · 0 评论