Mysql
文章平均质量分 86
Mysql
二狗家有矿
这个作者很懒,什么都没留下…
展开
-
mysql联合索引的使用规则
从一道有趣的题目开始分析:假设某个表有一个联合索引(c1,c2,c3,c4)以下选项哪些字段使用了该索引:A where c1=x and c2=x and c4>x and c3=xB where c1=x and c2=x and c4=x order by c3C where c1=x and c4= x group by c3,c2D where c1=? and c5=? order by c2,c3E where c1=? and c2=? and c5=? order by转载 2021-04-02 11:31:42 · 229 阅读 · 0 评论 -
超神之路-MySQL
一、基础架构和日志相关1、一个查询语句是怎么执行的?查询缓存弊大于利,因为更新操作会让缓存失效,所以MySQL8.0将此部分彻底移除了。2、一条更新语句是怎么执行的?3、redolog和binlog的区别?redo log 是 InnoDB 引擎特有的,binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。 redo log 是物理日志,记录的是“在某个数据页上做了什么修改”,binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给...转载 2021-03-16 00:29:13 · 326 阅读 · 0 评论 -
都2020年了,你还不知道count(1)和count(*)谁效率更高吗?
今天公司的一个需求需要统计一个数据库中表的行数有多少,二话不说当然就直接用count()这个聚合函数,以前经常听到一种说法说count(1)的效率比count(*)要高,于是测试了一下count(1)和count(*)的速度差距,发现两者的查询速度很接近,甚至count(*)要更快一些,于是就有了这篇文章。1.count()的用法count()聚合函数应该是我们学习数据库时最早学到的函数,主要用于查询表中数据的数量,常用的查询语句有count(*),count(字段),count(1),cou...转载 2021-03-11 22:57:52 · 259 阅读 · 0 评论 -
白话Mysql的锁和事务隔离级别!死锁、间隙锁你都知道吗?
(一)概述我们把那些可能会被多个线程同时操作的资源称为临界资源,加锁的目的就是让这些临界资源在同一时刻只能有一个线程可以访问。这是当时在讲synchronized锁时提出的锁的概念。数据库作为用户共享的一个资源,如何保证数据并发访问一致性也是所有数据库必须解决的问题,如何加锁是数据库并发访问性能的一个重要因素。(二)关于数据库的锁从加锁形式上分为乐观锁和悲观锁从对数据库操作的类型分为读锁(共享锁)和写锁(排他锁)读锁:多个读操作可以同时进行不会互相影响写锁:当前写操作没有完成前...转载 2021-03-11 22:55:35 · 202 阅读 · 0 评论 -
【MySQL】事务与锁(一):详解数据库事务及并发时可能出现的问题
在项目里面,什么地方会开启事务,或者配置了事务?无论是在方法上加注解,还是配置切面。<tx:adviceid="txAdvice"transaction-manager="transactionManager"> <tx:attributes> <tx:methodname="save*" rollback-for="Throwable"/> <tx:methodname="add*" rollback-for="T转载 2021-02-25 08:56:19 · 201 阅读 · 0 评论 -
【MySQL】性能调优(五):架构。集群及分库分表
1.数据库集群如果单台数据库服务满足不了访问需求,那我们可以做数据库的集群方案。集群的话必然会面临一个问题,就是不同的节点之间数据一致性的问题。如果同时读写多台数据库节点,怎么让所有的节点数据保持一致?1.1 主从架构这个时候我们需要用到复制技术(replication),被复制的节点称为 master,复制的节点称为 slave。slave 本身也可以作为其他节点的数据来源,这个叫做级联复制。主从复制是怎么实现的呢?更新语句会记录binlog,它是一种逻辑日志。有了这个binlog,.转载 2021-02-25 08:59:02 · 294 阅读 · 0 评论 -
【MySQL】性能调优(四):SQL。EXPLAIN 执行计划详解
使用 EXPLAIN 关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈,另外explain extend + show warnings:可以查看mysql优化后的sql语句 explain partitions:相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。在看执行计划前,我们先创建三张表。一张课程表,一张老师表,一张老师联系方式表(三张表没有任何索引):-- 课转载 2021-02-25 08:58:50 · 553 阅读 · 0 评论 -
【MySQL】性能调优(三):SQL。慢查询日志及SQL优化建议
问题:在我们做项目的时候,如何找到那些耗时比较长的查询语句呢?我们的服务层每天执行了这么多SQL语句,它怎么知道哪些SQL语句比较慢呢?第一步,我们要把SQL执行情况记录下来 ⇒ 慢查询日志slow query log.1.慢日志1.1 开启慢日志因为开启慢查询日志是有代价的(跟 binlog、optimizer-trace一样),所以它默认是关闭的:show variables like 'slow_query%';set GLOBAL slow_query_log="ON"; ..转载 2021-02-25 08:58:37 · 454 阅读 · 0 评论 -
【MySQL】性能调优(二):表结构。建表及存储引擎几点建议
1.建表的几点建议不要用外键、触发器、视图 降低了可读性; 影响数据库性能,应该把把计算的事情交给程序,数据库专心做存储; 数据的完整性应该在程序中检查 关于大文件存储: 不要用数据库存储图片(比如base64编码)或者大文件; 把文件放在 NAS 上,数据库只需要存储URI(相对路径),在应用中配置 NAS 服务器地址。 关于表拆分: 将不常用的字段拆分出去,避免列数过多和数据量过大。 比如在业务系统中,要记录所有接收和发送的消息,这个消息是 XML 格式的,用 bl转载 2021-02-25 08:58:18 · 102 阅读 · 0 评论 -
【MySQL】性能调优(一):配置。连接配置优化
我们说到性能调优,大部分时候想要实现的目标是让我们的查询更快。一个查询的动作又是由很多个环节组成的,每个环节都会消耗时间,我们在【MySQL】查询sql的执行过程及MySQL架构分析分析过了。我们要减少查询所消耗的时间,就要从每一个环节入手。MySQL 性能调优系列:【MySQL】性能调优(一):配置。连接配置优化 【MySQL】性能调优(二):表结构。建表及存储引擎几点建议 【MySQL】性能调优(三):SQL。慢查询日志及SQL优化建议 【MySQL】性能调优(四):SQL。EXPL转载 2021-02-25 08:58:00 · 204 阅读 · 0 评论 -
【MySQL】事务与锁(五):死锁问题分析
在我们使用锁的时候,有一个问题是需要注意和避免的,我们知道,排它锁有互斥的特性。一个事务或者说一个线程持有锁的时候,会阻止其他的线程获取锁,这个时候会造成阻塞等待,如果循环等待,会有可能造成死锁。这个问题我们需要从几个方面来分析,一个是锁为什么不释放,第二个是被阻塞了怎么办,第三个死锁是怎么发生的,怎么避免。1.锁的释放与阻塞锁什么时候释放?事务结束(commit,rollback)或客户端连接断开。如果一个事务一直未释放锁,其他事务会被阻塞多久?会不会永远等待下去?如果是,在并发访问比较高转载 2021-02-25 08:57:44 · 646 阅读 · 0 评论 -
【MySQL】事务与锁(四):锁粒度?表锁,行锁。锁模式?共享锁,排他锁,意向锁。锁算法?记录锁,间隙锁,临键锁
官网把锁分成了8 类。我们一般把前面的两个行级别的锁(Shared and ExclusiveLocks),和两个表级别的锁(Intention Locks)称为锁的基本模式。后面三个RecordLocks、GapLocks、Next-KeyLocks,我们把它们叫做锁的算法,也就是分别在什么情况下锁定什么范围。1.锁的粒度InnoDB 里面既有行级别的锁,又有表级别的锁,我们先来分析一下这两种锁定粒度的一些差异。表锁,顾名思义,是锁住一张表;行锁就是锁住表里面的一行数据。锁定粒度,表锁肯定是大于.转载 2021-02-25 08:57:31 · 351 阅读 · 0 评论 -
【MySQL】事务与锁(三):行锁到底锁住的是什么?记录?字段?索引?
首先我们有三张表 t1,t2,t3,它们都是只有两个字段, int类型的id和varchar类型的name;区别是t1没有索引,t2有主键索引,t3有唯一索引。再强调一次,在实验前必须提前关闭自动提交,set autocommit=off。然后show variables like 'autocommit'查看自动提交是否是off。我们先假设InnoDB的锁锁住了是一行数据或者一条记录。1.假设锁住记录1.1 实验一:没有索引的表(t1)这个实验操作是操作没有索引的t1,t1里面有4转载 2021-02-25 08:57:16 · 1786 阅读 · 1 评论 -
【MySQL】事务与锁(二):事务并发控制方案(LBCC、MVCC)
大家想一下,如果要解决读一致性的问题,保证一个事务中前后两次读取数据结果一致,实现事务隔离,应该怎么做?因为在InnoDB里面,所有的活动都是运行在事务里面的,如果autocommit=1,每个SQL语句都是一个事务,所以这个问题也可以这么问:MySQL如何实现并发控制?总体上来说,我们有两大类的方案:LBCC和MVCC。1.方案一:LBCC第一种,我既然要保证前后两次读取数据一致,那么我读取数据的时候,锁定我要操作的数据,不允许其他的事务修改就行了。这种方案我们叫做基于锁的并发控制Lock B转载 2021-02-25 08:57:00 · 508 阅读 · 0 评论 -
【MySQL】索引原理(四):创建索引的几点建议,列的离散度,前缀索引
我们容易有以一个误区,就是在经常使用的查询条件上都建立索引,索引越多越好,那到底是不是这样呢?因为索引对于改善查询性能的作用是巨大的,所以我们的目标是尽量使用索引。但这并不意味着索引越多越好,因为索引会占用内存,还需要维护,并且索引还会影响增删改速度(还要对(辅助)索引进行插入/删除)。所以我们创建索引时有什么能参考的属性,或者要遵守的原则呢?1.列的离散度我们先来看一个重要的属性列的离散度,公式如下:count(distinct(column_name)) : count(*) --转载 2021-02-24 00:20:06 · 658 阅读 · 0 评论 -
【MySQL】索引原理(三):联合索引(最左前缀原则),覆盖索引,索引条件下推
准备工作,下面的演示都是基于user_innodb表:DROP TABLE IF EXISTS `user_innodb`;CREATE TABLE `user_innodb` ( `id` bigint(64) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `gender` tinyint(1) NOT NULL, `phone` varchar(11) NOT NULL, PRIMARY KEY (`id`))转载 2021-02-24 00:18:59 · 586 阅读 · 0 评论 -
【MySQL】索引原理(二):B+Tree索引的实现,MyISAM 和 InnoDB
在【MySQL】存储引擎(一):存储引擎介绍一文中,我们说过了,MySQL是一个支持插件式存储引擎的数据库。在MySQL里面,每个表在创建的时候都可以指定它所使用的存储引擎。这里我们主要关注一下最常用的两个存储引擎,MyISAM和InnoDB的索引的实现。首先,MySQL的数据都是文件的形式存放在磁盘中的,我们可以找到这个数据目录的地址。在MySQL中有这么一个参数,我们来看一下:show VARIABLES LIKE 'datadir';每张InnoDB 的表有两个文件(.frm和.i转载 2021-02-24 00:17:12 · 150 阅读 · 0 评论 -
【MySQL】索引原理(一):索引的存储结构是什么?数组?链表?树?
索引是什么?索引是帮助 MySQL高效获取数据的排好序的数据结构第一个问题,为什么说索引能高效获取数据呢?首先数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有索引的话,要从500万行数据里面检索一条数据,只能依次遍历这张表的全部数据,直到找到这条数据。但是有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种特殊的专门用来快速检索的数据结构,我们找到数据存放的磁盘地址以后,就可以拿到数据了。就像我们从一本 500 页的书里面去找特定的一小节的内.转载 2021-02-24 00:16:16 · 1900 阅读 · 0 评论 -
【MySQL】存储引擎(五):重做日志(redo log),回滚日志(undo log),二进制日志(binlog)
MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。这里简单总结一下这三者具有一定相关性的日志。1.重做日志(redo log)MySQL 在更新数转载 2021-02-24 00:14:56 · 203 阅读 · 0 评论 -
【MySQL】存储引擎(四):InnoDB 逻辑存储结构
MySQL的存储结构分为5级:表空间、段、簇、页、行。1.表空间 TableSpace上篇【MySQL】从InnoDB的内存结构、磁盘结构到update sql执行过程分析在磁盘结构部分就说过了,表空间可以看做是InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。分为:系统表空间、独占表空间、通用表空间、临时表空间、Undo表空间。2.段 Segment表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等,段是一个逻辑的概念。一个ibd文件(独立表空间文件)里面会.转载 2021-02-24 00:13:49 · 138 阅读 · 0 评论 -
【MySQL】存储引擎(三):InnoDB 磁盘结构(表空间)
磁盘结构里面主要是各种各样的表空间,叫做Table space。表空间可以看做是 InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。InnoDB的表空间分为5大类。1.system tablespace(系统表空间)在默认情况下 InnoDB 存储引擎有一个共享表空间(对应文件/var/lib/mysql/ibdata1),也叫系统表空间。InnoDB 系统表空间包含InnoDB数据字典和双写缓冲区,ChangeBuffer和UndoLogs),如果没有指定file-per-转载 2021-02-24 00:12:45 · 367 阅读 · 0 评论 -
【MySQL】存储引擎(二):InnoDB 内存结构
Innodb 的内存结构主要分为 3 个部分: Buffer Pool、Change Buffer、Adaptive HashIndex,另外还有一个(redo)log buffer。我们可到再官网看到 InnoDB 的内存结构和磁盘结构。1.Buffer Pool(缓存池)首先,InnnoDB 的数据都是放在磁盘上的,InnoDB 操作数据有一个最小的逻辑单位,叫做页(索引页和数据页)。我们对于数据的操作,不是每次都直接操作磁盘,因为磁盘的速度太慢了。 InnoDB使用了一种缓冲池的技术,也就转载 2021-02-24 00:11:49 · 232 阅读 · 0 评论 -
【MySQL】存储引擎(一):存储引擎介绍
首先来想一个问题,在关系型数据库里面,数据是放在什么结构里面的?答:放在表Table里面的,我们可以把这个表理解成Excel电子表格的形式。所以,我们的表在存储数据的同时,还要组织数据的存储结构,这个存储结构就是由我们的存储引擎决定的,所以我们也可以把存储引擎叫做表类型。在MySQL里面,支持多种存储引擎,他们是可以替换的,所以叫做插件式的存储引擎。为什么要搞这么多存储引擎呢?一种还不够用吗?这个问题先留着。1.查看存储引擎比如我们数据库里面已经存在的表,我们怎么查看它们的存储引擎呢?转载 2021-02-24 00:11:05 · 651 阅读 · 0 评论 -
【MySQL】运行原理(三):增删改 SQL 执行过程分析
在上一篇文章,我们介绍了查询 SQL 的执行流程,所以,是不是再讲讲更新流程、插入流程和删除流程?首先,要明确一点,在数据库里面,我们说的 update 操作其实包括了更新、插入和删除。如果大家有看过 MyBatis 的源码,应该知道 Executor 里面也只有 doQuery() 和 doUpdate() 的方法,没有 doDelete() 和 doInsert()。更新流程和查询流程有什么不同呢?基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。区别就在于拿到符合条转载 2021-02-24 00:10:12 · 407 阅读 · 1 评论 -
【MySQL】运行原理(二):InnoDB 内存结构、磁盘结构及update sql执行过程分析
前一篇讲完了查询流程,我们是不是再讲讲更新流程、插入流程和删除流程?在数据库里面,我们说的update操作其实包括了更新、插入和删除。如果大家有看过MyBatis的源码,应该知道Executor里面也只有doQuery()和doUpdate()的方法,没有doDelete()和doInsert()。更新流程和查询流程有什么不同呢?基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。区别就在于拿到符合条件的数据之后的操作。缓冲池 Buffer Pool首先,InnnoDB转载 2021-02-23 09:18:25 · 190 阅读 · 0 评论 -
【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析
MySQL的发展历史和版本分支:时间 里程碑 1996 年 MySQL1.0 发布。它的历史可以追溯到 1979 年,作者 Monty 用 BASIC 设计的一个报表工具。 1996 年 10 月 3.11.1 发布。MySQL 没有 2.x 版本。 2000 年 ISAM 升级成 MyISAM 引擎。MySQL 开源。 2003 年 MySQL4.0 发布,集成 InnoDB 存储引擎 2005 年 MySQL5.0 版本发布,提供了视图、存储过转载 2021-02-23 09:16:11 · 595 阅读 · 0 评论 -
【MySQL】基本SQL语句大全
1.库操作登录数据库mysql -h {ip} -u {username} -p{password} -P {port}# -h ip默认是 localhost# -p 指定密码时中间不要空格,比如 -p123456# -P 端口默认是 3306 1.1 增create database 库名1.2 删drop database 库名1.3 查show databses1.4 用use 库名2.表操作2.1 增create ta转载 2021-02-23 09:12:39 · 297 阅读 · 0 评论