![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
MySQL
文章平均质量分 74
MySQL
码拉松
这个作者很懒,什么都没留下…
展开
-
一文解决MySQL突击面试,关键知识点总结
A (Atomicity, 原子性)一个事务中的所有操作要不全部成功,要不全部失败,不能出现部分成功,部分失败的情况。C(Consistency,一致性)数据库设计上这个含义比较模糊,简单可以理解为财务的对账一样,两边数据的加加减减必须要能保持一致。I(Isolation,隔离性)主要是针对在并发场景下,对于共享资源的访问要有一定的隔离性,在MySQL中隔离性也是分等级的,根据不同的业务需求选择不同的隔离性,主要依靠锁+MVCC来实现,隔离性越强,数据库的吞吐就越差。原创 2023-05-03 09:14:51 · 1452 阅读 · 1 评论 -
【MySQL常见错误】关于MySQL NULL值的处理
文章目录前言1. 一道测试题2. 如何判断null值3. Null不要进行算术运算4. 使用GROUP BY、ORDER BY5. COUNT()、 MIN()和 SUM()忽略 NULL值前言从概念上看,MySQL对Null的定义是a missing unknown value,它与空字符串''并不是一回事,MySQL对于它的处理方式也有些不同,对于初学者来说经常会把这二者混淆,本文就结合一些案例来具体看看。1. 一道测试题先从一道简单的测试题看起表名:customer,表中数据如下:mysq原创 2022-04-27 19:00:00 · 1479 阅读 · 0 评论 -
GROUP_CONCAT超长截断问题
前言MySQL提供的GROUP_CONCAT函数,其作用是返回一个组合所有值的字符串。使用演示有t1表,字段、数据如下。使用如下语句查询。select name,GROUP_CONCAT(age) from t1 GROUP BY name;得到的查询结果。GROUP_CONCAT其他语法GROUP_CONCAT还可以对字段属性进行排序、去重、自定义拼接分隔符。去重、降序、使用逗号分割查询select name,GROUP_CONCAT(DISTINCT age order by原创 2022-02-03 21:37:50 · 3081 阅读 · 0 评论 -
关于MySQL行数统计不精准的问题
前言如果你使用SHOW TABLE STATUS、或者使用select * from information_schema.tables、或者通过执行计划的ROW列等方式查询一张表的行数,那么你会发现统计出来的行数并不准确,当然只有当你使用的是InnoDB存储引擎时才会这样,如果是MyISAM存储引擎统计的行是精确的。为什么InnoDB统计的不是精确值对于MyISAM这样的存储引擎,在内存中直接存储了每张表的行数,所以当你查询时可以快速返回,而对于InnoDB这样带事务存储引擎,如果也直接存储精确的行原创 2022-02-02 19:33:14 · 4312 阅读 · 0 评论 -
MySQL中的MRR优化分析
前言MRR全称:Multi-Range Read,中文翻译过来就是多范围读取,主要解决的是当二级索引取出索引值后再去聚集索引中取行可能会造成大量的磁盘随机IO的问题,下面我们来具体进行分析。Index Nested-Loop Join在了解MRR前,我们先看一下什么是Index Nested-Loop Join(简称NLJ),直接翻译过来嵌套循环连接,就和我们平时写嵌套循环的思路是一样的,外层循环一个一个的去数,然后与内层循环挨个匹配。假设要使用以下连接类型执行三个表t1、t2和 之间 t3的连接:原创 2021-09-27 15:48:53 · 1709 阅读 · 1 评论 -
MySQL中的Block Nested Loop优化分析
前言一般在MySQL规范中,都会规定如果两张表进行join查询,那么join的字段一定要有索引,在之前的文章中我们分析了MySQL join大小表前后顺序影响分析,这是在有索引的情况下,今天我们再来看看如果没有索引MySQL会如何处理。数据准备新建了两张表,分别为t1,t2。t1和t2表都是一个id字段作为主键,一个c字段,没有索引。分别插入10条数据t1,t2表数据都如下Join查询EXPLAIN select * from t1 LEFT JOIN t2 on t1.c = t2.c原创 2021-09-22 22:41:53 · 4249 阅读 · 2 评论 -
InnoDB引擎与Memory引擎对比
准备我们先来创建两张表,一张表使用InnoDB引擎,一张表使用Memory引擎。CREATE TABLE t1 ( id INT, c INT, PRIMARY KEY ( id ) ) ENGINE = MEMORY;CREATE TABLE t2 ( id INT, c INT, PRIMARY KEY ( id ) ) ENGINE = INNODB;默认的索引结构我们都知道InnoDB引擎是使用B+树的索引结构,而Memory引擎则是使用Hash索引。对于B+树来说,我们都知道数据是存原创 2021-09-19 11:33:26 · 511 阅读 · 0 评论 -
MySQL join大小表前后顺序影响分析
前言我相信你一定听说过在做两张表join查询时,要让小表作为驱动表,如果你不知道这是为什么,那么本文就通过分析join的执行过程,来回答这个问题。数据准备原创 2021-09-14 19:52:07 · 10026 阅读 · 3 评论 -
MySQL优化之索引合并
前言原创 2021-09-12 11:21:37 · 289 阅读 · 0 评论 -
MySQL为什么会选择B+树索引?
前言我们都知道MySQL的InnoDB存储引擎中,默认、且提供给客户端使用的只能是B+树存储结构,尽管MySQL中还会有像Hash、R树、全文索引这样的存储方式,但在InnoDB中并不能显示的使用,这主要还是因为在大多数普适场景中,还是B+树这样的存储结构,更能满足实际的业务使用场景,本文就来分析分析B+树到底适用在哪里?二叉树那我们不妨先来看看,同样是树的存储结构,为什么不能使用二叉树系列的存储方式。假设现在我们有如下一些索引值:20,4,13,7,1,17,9,2,6,11我们先按照搜索二叉树原创 2021-09-08 14:35:19 · 379 阅读 · 0 评论 -
为什么varchar上的索引必须要指定索引长度?
前言看过阿里Java开发手册的同学,应该有注意到在MySQL索引规约中,有这么一条强制性规范:本文就来分析分析为什么在varchar上的索引必须要指定索引长度?索引结构要了解原因,必须先对索引结构有一定认识,一般我们都会使用InnoDB存储引擎,其对应的索引结构就是B+TREE。B+TREE和其他二叉树的最大区别就在于,节点的度可以设置的很大,MySQL中就定义了16KB为一页,一页就是树的一个节点。下图,树的根节点中,7、13对应的就是保存的索引字段值。那么,既然一页的大小是恒定的16原创 2021-09-06 13:11:49 · 4219 阅读 · 1 评论 -
MySQL Change Buffer设计分析
Change Buffer的由来?我们应该知道MySQL为了提升数据读取的效率,会将从磁盘中读取的数据放入内存中的一个名为缓冲池的数据结构中,这样下次再查询时,如果数据在缓冲池中,就可以直接返回了,从而减少了一次随机的磁盘IO。缓冲池解决了数据查询每次都要从磁盘查找的问题,但是并不能解决数据更新或者插入的问题,当需要更新一条数据时,按道理应该需要先把数据从磁盘读取到缓冲池中,然后再更新缓冲池中的数据页,最后再写回磁盘,这样就会产生两次磁盘IO的操作,所以为了解决多次磁盘IO的问题,MySQL就设计出了C原创 2021-09-01 21:23:02 · 163 阅读 · 0 评论 -
从change buffer分析MySQL唯一索引与普通索引的选择
前言不知道你有没有遇到过,把一个原本为普通索引的列改为唯一索引,反而造成了系统阻塞,按照常规理解,唯一索引应该是要比普通索引更高效的才对,不过实际上也是要分场景的,本文就结合change buffer来分析下唯一索引与普通索引究竟有什么区别。为什么会有change buffer如果没有change buffer,那么当我们写数据时就需要先从磁盘加载数据页到缓冲池,然后再对数据页进行修改。而有了change buffer的存在后,就不需要先从磁盘加载数据页,而是可以直接把数据写到change buff原创 2021-09-01 16:29:29 · 280 阅读 · 0 评论 -
彻底搞清楚MySQL字符编码不一致造成索引失效的问题
前言我相信你一定听说过,如果两张表字符编码不一致,索引字段在进行join时会导致索引失效,但一定是这样的吗?本文就来一起仔细分析一下这个问题。准备我们先准备两个表,一个采用utf8的字符集,一个采用utf8mb4的字符集,并分别插入一条数据。-- 建表采用utf8字符集CREATE TABLE t_utf8 ( id INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id', age INT ( 11 ) COMMENT '年龄',原创 2021-08-24 09:16:37 · 2449 阅读 · 6 评论 -
深入理解MySQL的MVCC机制
什么是MVCC?MVCC(多版本并发控制),实现并发访问的一种方式,在mysql的Innodb引擎读已提交和可重复读两种隔离级别下,事务在select时实际上读取的是版本链中的数据。MVCC只在Innodb引擎下,事务隔离级别为读已提交和可重复读时才存在简单来理解,你可以想象一下Java中的写时复制(CopyOnWrite),其实思想都是差不多的,为了能够做到读写不互斥,所以在每次写入时,总是先copy一份,读请求还是读的原来的,而写请求时写的copy出来的,写完之后在用copy的覆盖原来的。那原创 2021-08-19 08:34:12 · 440 阅读 · 0 评论 -
MySQL行级锁效果演示
MySQL innodb 基于索引的行级锁测试原创 2021-08-18 21:35:15 · 233 阅读 · 0 评论 -
深入分析隐式转换导致MySQL索引失效
前言关于MySql索引失效的几种原因分析,之前在这篇文章中已经有过整理,也演示了隐式转换造成索引失效的例子,本文主要来分析一下,文章中提到的:如果是数值类型,则右边无论是带引号还是不带引号都可以走索引。案例先看一下之前的案例CREATE TABLE t_user_demo (id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id',name VARCHAR(20) DEFAULT NULL COMMENT '姓名',phone cha原创 2021-08-10 20:01:19 · 1207 阅读 · 1 评论 -
MySQL使用count(*),count(1),count(字段)统计行数的区别
前言平时在做业务开发时,我相信你肯定经常会遇到对数据表进行行数统计的需求,比如在查询列表的分页时,我不知道你一般是使用count(*)还是count(1)亦或是count(字段),反正我是都遇见过,他们看起来都能得到你想要的结果,不过,实际上它们还是略有不同的,本文我们就来看看这三种统计方式究竟有哪些区别。count(expr)函数count(expr)是一个聚合函数,在MySQL中对于它的定义是:返回 语句检索的行中的非NULL 值数的计数。结果是一个值。 如果没有匹配的行,则 COUNT()返原创 2021-08-04 16:02:05 · 492 阅读 · 1 评论 -
如何优化MySQL服务CPU过高的问题
前言对于JVM引起的CPU过高的问题,已经有很多解决套路了,本文再来分析一下如果是MySQL服务CPU过高应该如何排查!定位CPU过高的原因可以通过vmstat进行排查,关注用户空间(us)、系统空间(sy)、IO等待(wa)、软硬中断(in)、空闲(id),而系统空间(sy)、软硬中断(in)一般我们也控制不了,所以主要围绕us、wa、id来分析。用户空间消耗那有可能是存在大量的函数计算、排序等类似的操作IO等待那有可能是慢查询过多,或者并发量过高。关于如何优化其实对于MySQL而言,不原创 2021-03-03 16:20:33 · 154 阅读 · 1 评论 -
轻松入门MySQL主从复制原理
MySQL主从同步的原理原创 2021-01-29 15:51:05 · 990 阅读 · 1 评论 -
关于MySQL wait_timeout问题记录
MySQL wait_timeout原创 2021-01-26 16:22:51 · 1131 阅读 · 0 评论 -
MySQL事务ACID底层实现原理
MySQL事务ACID底层实现原理原创 2021-01-10 19:31:58 · 440 阅读 · 0 评论 -
MySQL索引基础知识梳理
MySQL索引原创 2020-12-28 22:13:25 · 172 阅读 · 0 评论 -
MySQL脏读、不可重复读、幻读案例演示
MySQL脏读、不可重复读、幻读测试原创 2020-12-08 18:13:17 · 700 阅读 · 2 评论 -
MySQL优化Limit查询语句
Limit一般可以用来分页,例如如下查询语句select * from table LIMIT m,n。表示从第m条开始,查询n条数据。如果表中数据量非常多的时候,那么m越大,查询就会越慢。一般分页语句EXPLAIN select * from page_test LIMIT 100000,5;分析执行计划可以看出,没有使用到任何查询优化,type类型为All,这是type中最低效的查询指标。利用覆盖索引优化EXPLAIN select * from page_test a, (sele原创 2020-12-04 11:00:37 · 153 阅读 · 0 评论 -
CentOS搭建MySQL主从环境详细过程
搭建环境CentOS6.5MySQL5.7准备两台虚拟机,本文演示使用如下两台:192.168.70.114(主)192.168.70.115(从)单机MySQL安装过程可参考 Linux安装MySQL5.7详细步骤前前置条件准备好之后,开始搭建主从环境。1、分别在两台数据库中准备一个需要主从同步的数据库create database wyl;2、主节点配置2.1、首先修改配置文件,执行如下命令:vi /etc/my.cnf2.2、添加如下配置log-bin=master-b原创 2020-12-01 19:51:02 · 415 阅读 · 0 评论 -
InnoDB共享、排他、意向、间隙锁机制
MySQL中的锁MySQL中不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking),InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。InnoDB锁本文主要探讨InnoDB存储引擎中的锁机制,大致分文如下几种锁类型:共享锁和排它锁(Shared and Exclusive Locks)意向锁(Intention Locks)记录锁(Record Locks)原创 2020-11-25 17:55:49 · 261 阅读 · 0 评论 -
Linux安装MySQL5.7详细步骤
1、查看linux环境中是否自带了mysqlyum list installed | grep mysql2、删除自带的mysqlyum -y remove mysql-libs.x86_643、给CentOS添加rpm源。wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm4、安装下载好的rpm文件yum install mysql-community-release-el6-5.noarch.rpm -y5原创 2020-11-19 13:09:00 · 1104 阅读 · 0 评论 -
MySQL5.6优化---索引下推
什么是索引下推?Index Condition Pushdown(ICP)是针对MySQL使用索引从表中检索行的情况的优化。如果不使用ICP,则存储引擎将遍历索引以在基表中定位行,并将其返回给MySQL服务器,后者将评估WHERE行的条件。启用ICP后,如果WHERE可以仅使用索引中的列来评估部分 条件,则MySQL服务器会将这部分条件压入WHERE条件下降到存储引擎。然后,存储引擎通过使用索引条目来评估推送的索引条件,并且只有在满足此条件的情况下,才从表中读取行。ICP可以减少存储引擎必须访问基表的次数原创 2020-08-18 15:51:34 · 584 阅读 · 0 评论 -
全面掌握MySQL执行计划分析
MySQL执行计划的作用当我们在执行的sql语句前面加上EXPLAIN关键字,就可以模拟得到优化器执行的sql语句,从而了解MySQL是如何解析你的sql语句,然后针对执行结果进行相应的sql优化。执行计划查询的结果主要由以下列组成,接下来就主要针对这些列进行详细解析。 id列id列为由数字表示,是一组序号,表示执行sql语句的顺序。id的查询结果有两种可能:1、id相同:执行顺序由上而下2、id不同:id值大的优先执行 select_type列select_type表示查询的类型原创 2020-07-22 19:54:51 · 1876 阅读 · 0 评论 -
MySQL建立索引的注意事项
大家都知道对数据库表字段建立索引可以有效的提升数据的查询效率,但索引也不是随便建立的,需要我们对建立索引的规范有一定的了解,才能更好的发挥出索引的优势,避免因为滥建索引反而带来整体性能的下降。1、哪些列上建立索引?一般我们会建议在经常被查询的列上建立索引,但也需要注意如果该列更新比较频繁或者区分度不高(比如只有一个状态0/1的标识),那么就需要考虑是否值得建立索引了。在更新比较频繁的列上建立索引,会降低更新时的效率,因为每次更新都需要对索引的存储进行维护。一般经常被查询的列、排序的列、关联查询的列、原创 2020-06-22 17:22:48 · 3740 阅读 · 0 评论 -
MySql索引失效的几种原因分析
1、联合索引不满足最左匹配原则2、隐式转换3、like查询4、索引列null值字段5、优化器6、索引列存在运算原创 2020-06-16 10:21:48 · 3353 阅读 · 0 评论