![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL
文章平均质量分 89
morris131
这个作者很懒,什么都没留下…
展开
-
【MySQL】MySQL常用日期时间函数
MySQL提供了大量的日期和时间函数,这些函数用于在查询中处理和操作日期与时间值。参考官方文档:https://dev.mysql.com/doc/refman/8.4/en/date-and-time-functions.html。原创 2024-06-19 13:46:44 · 16481 阅读 · 0 评论 -
【MySQL】分组排序取每组第一条数据
需求:MySQL根据某一个字段分组,然后组内排序,最后每组取排序后的第一条数据。要求:查询出各科分数最高的学生姓名。原创 2024-05-13 16:09:50 · 11480 阅读 · 1 评论 -
【MySQL】字符集utf8mb4无法存储表情踩坑记录
字段上的字符集优先级高于表的字符集,表的字符集优先级高于数据库的字符集,理论上只要表的字符集为utf8mb4就能存储表情,真的是这样吗?MySQL数据表的字符集已经设置成了utf8mb4,但是通过JDBC向数据库写入4字节的emoji表情时报错,但是通过直接使用SQL语句在命令行插入该4字节的emoji表情时却成功了。示例如下。...原创 2022-07-22 09:00:00 · 15010 阅读 · 0 评论 -
【MySQL】MySQL复制架构
一主多从复制架构在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式。在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求不是特别高的读请求通过负载均衡分部到多个从库上(对于实时性要求很高的读请求可以让从主库去读),降低主库的读取压力,如下图所示。缺点:master不能停机,停机就不能接收写请求slave过多会出现延迟由于master需要进行常规维护停机了,那么必须要把一个slave提成master原创 2022-02-19 11:20:24 · 38147 阅读 · 0 评论 -
【MySQL】MySQL复制之GTID复制
从MySQL 5.6.5开始新增了一种基于GTID的复制方式。通过GTID保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。GTID是什么GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID实际上是由UUID+TID 组成的。其中UUID是一个 MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。下面是一个GTID的具体形式:3E11原创 2022-02-19 11:19:13 · 38352 阅读 · 0 评论 -
【MySQL】MySQL复制技术
异步复制在异步复制(async replication)中,Master不用关心Slave是否接收到二进制日志,所以Master与Slave没有任何的依赖关系。你可以认为Master和Slave是分别独自工作的两台服务器,数据最终会通过二进制日志达到一致。异步复制的性能最好,因为它对数据库本身几乎没有任何开销,除非主从延迟非常大,Dump Thread需要读取大量二进制日志文件。如果业务对于数据一致性要求不高,当发生故障时,能容忍数据的丢失,甚至大量的丢失,推荐用异步复制,这样性能最好(比如像微博这原创 2022-02-19 11:17:48 · 12117 阅读 · 0 评论 -
【MySQL】MySQL之Binlog
Binlog格式介绍MySQL binlog日志有三种格式,分别为:StatementMiXEDROW查看数据库使用的是什么模式:mysql> show variables like 'binlog_format';+---------------+-------+| Variable_name | Value |+---------------+-------+| binlog_format | ROW |+---------------+-------+1 row原创 2022-02-09 18:36:18 · 13485 阅读 · 0 评论 -
【MySQL】MySQL中的死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。死锁是必然发生在多操作者(M>=2 个)情况下,争夺多个资源(N>=2 个,且N<=M)才会发生这种情况。很明显,单线程自然不会有死锁;单资源只会产生激烈竞争,也不会产生死锁。同时,死锁还有几个要求:争夺资源的顺序不对,如果争夺资源的顺序是一样的,也不会产生死锁;争夺者拿到资源不放手。死锁学术化的定义死锁的发原创 2022-02-09 18:31:37 · 14012 阅读 · 0 评论 -
【MySQL】MySQL中的表锁
锁是计算机协调多个线程并发访问某一资源的机制。在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。MySQL的锁机制比较简单,表锁由MySQL Server实现,行锁则是存储引擎各自实现,不同的引擎实现的方式不同。在MySQL的常用引擎中InnoDB支持行锁,而MyISAM则只能使用MySQL Server提供的表锁。几种常见锁的比较:表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生原创 2022-02-09 18:30:09 · 15570 阅读 · 0 评论 -
【MySQL】InnoDB中的GAP锁详解
测试数据:CREATE TABLE `lock_test` ( `a` int(11) NOT NULL AUTO_INCREMENT, `b` int(11) NOT NULL, `c` int(11) NOT NULL, `d` int(11) NOT NULL, PRIMARY KEY (`a`), UNIQUE KEY `idx_b` (`b`), KEY `idx_c` (`c`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;IN原创 2022-01-16 21:06:55 · 6548 阅读 · 1 评论 -
【MySQL】InnoDB中的行级锁
行锁,也称为记录锁,顾名思义就是在记录上加的锁。但是要注意,这个记录指的是通过给索引上的索引项加锁。InnoDB 这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。只有执行计划真正使用了索引,才能使用行锁:即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL 通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会原创 2022-01-15 10:50:32 · 11763 阅读 · 1 评论 -
【MySQL】InnoDB解决事务并发问题
我们已经知道事务并发执行时可能带来的各种问题,最大的一个难点是:一方面要最大程度地利用数据库的并发访问,另外一方面还要确保每个用户能以一致的方式读取和修改数据,尤其是一个事务进行读取操作,另一个同时进行改动操作的情况下。MySQL在REPEATABLE READ隔离级别实际上就基本解决了幻读问题。怎么解决脏读、不可重复读、幻读这些问题呢?其实有两种可选的解决方案.解决事务并发问题的方案方案一:读操作MVCC,写操作加锁MVCC就是通过生成一个ReadView,然后通过ReadView找到符合条件的原创 2022-01-15 10:49:10 · 6983 阅读 · 0 评论 -
【MySQL】从二进制内容看InnoDB行格式
InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要一条一条的把记录从磁盘上读出来么?InnoDB采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为16KB。也就原创 2022-01-08 11:04:10 · 1490 阅读 · 0 评论 -
【MySQL】全局考虑性能优化
为什么查询速度会慢在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间。如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快。MySQL查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的原创 2022-01-08 11:02:33 · 1093 阅读 · 0 评论 -
【MySQL】InnoDB之MVCC原理
MVCC全称Multi-Version Concurrency Control,即多版本并发控制,主要是为了提高数据库的并发性能。同一行数据平时发生读写请求时,会上锁阻塞住。但MVCC用更好的方式去处理读—写请求,做到在发生读—写请求冲突时不用加锁。这个读是指的快照读,而不是当前读,当前读是一种加锁操作,是悲观锁。那它到底是怎么做到读—写不用加锁的,快照读和当前读是指什么?我们后面都会学到。MySQL在REPEATABLE READ隔离级别下,是可以很大程度避免幻读问题的发生的,MySQL是怎么做到的?原创 2022-01-08 10:58:59 · 713 阅读 · 0 评论 -
【MySQL】连接查询的本质
了解连接、内连接、外连接这些基本概念后,我们需要理解MySQL怎么样来进行表与表之间的连接,才能明白为什么有的连接查询运行的快,有的却慢。嵌套循环连接(Nested-Loop Join)我们前边说过,对于两表连接来说,驱动表只会被访问一遍,但被驱动表却要被访问到好多遍,具体访问几遍取决于对驱动表执行单表查询后的结果集中的记录条数。对于内连接来说,选取哪个表为驱动表都没关系,而外连接的驱动表是固定的,也就是说左(外)连接的驱动表就是左边的那个表,右(外)连接的驱动表就是右边的那个表。如果有3个表进行连原创 2022-01-01 11:31:33 · 12767 阅读 · 0 评论 -
【MySQL】单表访问之索引合并
MySQL在一般情况下执行一个查询时最多只会用到单个二级索引,但存在有特殊情况,在这些特殊情况下也可能在一个查询中使用到多个二级索引,MySQL中这种使用到多个索引来完成一次查询的执行方法称之为:索引合并/index merge,具体的索引合并算法有下边三种。mysql> show index from t_emp;+-------+------------+----------------+--------------+-------------+-----------+------------原创 2022-01-01 11:30:09 · 13165 阅读 · 0 评论 -
【MySQL】不建议使用分区表
分区表简介分区是指根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库的应用而言,逻辑上只有一个表或一个索引,但是实际上这个表可能由数10个物理分区对象组成,每个分区都是一个独立的对象,可以独自处理,可以作为表的一部分进行处理。分区对应用来说是完全透明的,不影响应用的业务逻辑。从上面的说明我们可以看到,分区表是一个独立的逻辑表,但是底层由多个物理子表组成。实现分区的代码实际上是对一组底层表的的封装。对分区表的请求,都会转化成对存储引擎的接口调用。所以分区对于SQL层来说是一个完原创 2022-01-01 11:28:34 · 5949 阅读 · 0 评论 -
【MySQL】exists与in的比较
关于exists代替inexists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为false。假设现在有如下两条SQL语句:select * from A where exists (select原创 2022-01-01 11:27:05 · 799 阅读 · 0 评论 -
MySQL深入思考索引在查询中的使用
索引在查询中的作用到底是什么?在我们的查询中发挥着什么样的作用呢?请记住:一个索引就是一个B+树,索引让我们的查询可以快速定位和扫描到我们需要的数据记录上,加快查询的速度。一个select查询语句在执行过程中一般最多能使用一个二级索引,即使在where条件中用了多个二级索引。t_emp表中的索引:mysql> show index from t_emp;+-------+------------+----------------+--------------+-------------原创 2021-12-26 19:11:46 · 5369 阅读 · 1 评论 -
MySQL高性能索引创建策略
索引的代价世界上从来没有只有好处没有坏处的东西,如果你有,请你一定要告诉我,让我也感受一下。虽然索引是个好东西,在学习如何更好的使用索引之前先要了解一下使用它的代价,它在空间和时间上都会拖后腿。空间上的代价这个是显而易见的,每建立一个索引都要为它建立一棵B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认会占用16KB的存储空间,一棵很大的B+树由许多数据页组成会占据很多的存储空间。时间上的代价每次对表中的数据进行增、删、改操作时,都需要去修改各个B+树索引。B+树每层节点都是按照索引列的值原创 2021-12-26 19:10:49 · 2886 阅读 · 1 评论 -
MySQL查询性能优化
MySQL性能优化其实是个很大的课题,在优化上存在着一个调优金字塔的说法:很明显从图上可以看出,越往上走,难度越来越高,收益却是越来越小的。比如硬件和OS调优,需要对硬件和OS有着非常深刻的了解,仅仅就磁盘一项来说,一般非DBA能想到的调整就是SSD盘比用机械硬盘更好,但其实它至少包括了,使用什么样的磁盘阵列(RAID)级别、是否可以分散磁盘IO、是否使用裸设备存放数据,使用哪种文件系统(目前比较推荐的是XFS),操作系统的磁盘调度算法(目前比较推荐deadline,对机械硬盘和SSD都比较合适。从内核原创 2021-12-26 19:09:36 · 1698 阅读 · 0 评论 -
MySQL高性能索引使用策略
不在索引列上做任何操作当使用索引列进行查询的时候不要使用表达式,不能使用函数,这样会导致索引失效,可以把计算放到应用层而不是数据库层。在索引列上使用函数无法使用索引:mysql> explain select * from t_emp where year(hire_date)='1971';+----+-------------+-------+------------+------+---------------+------+---------+------+--------+-----原创 2021-12-26 19:08:19 · 669 阅读 · 0 评论 -
MySQL中的各种索引
InnoDB中的索引自然也是按照B+树来组织的,前面我们说过B+树的叶子节点用来放数据的,但是放什么数据呢?索引自然是要放的,因为B+树的作用本来就是就是为了快速检索数据而提出的一种数据结构,不放索引放什么呢?但是数据库中的表,数据才是我们真正需要的数据,索引只是辅助数据,甚至于一个表可以没有自定义索引。InnoDB中的数据到底是如何组织的?索引的分类按存储方式划分根据索引的存储方式可以分为以下两种:聚簇索引(Clustered Index):数据与索引存储在一起,主键索引底层就是用聚簇索引实现原创 2021-12-19 20:44:09 · 1848 阅读 · 0 评论 -
InnoDB之Undo log
事务回滚的需求事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况,比如:1、事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误。2、程序员可以在事务执行过程中手动输入ROLLBACK语句结束当前的事务的执行。这两种情况都会导致事务执行到一半就结束,但是事务执行过程中可能已经修改了很多东西,为了保证事务的原子性,我们需要把东西改回原先的样子,这个过程就称之为回滚(rollback),这样就可以造成这个原创 2021-09-24 20:39:37 · 1418 阅读 · 0 评论 -
InnoDB之redo log
在事务的实现机制上,MySQL采用的是WAL(Write-ahead logging,预写式日志)机制来实现的。在使用WAL的系统中,所有的修改都先被写入到日志中,然后再被应用到系统中。通常包含redo和undo两部分信息。为什么需要使用WAL,然后包含redo和undo信息呢?举个例子,如果一个系统直接将变更应用到系统状态中,那么在机器掉电重启之后系统需要知道操作是成功了,还是只有部分成功或者是失败了(为了恢复状态)。如果使用了WAL,那么在重启之后系统可以通过比较日志和系统状态来决定是继续完成操作还原创 2021-09-24 20:31:15 · 1534 阅读 · 0 评论 -
InnoDB之Buffer Pool
对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以页的形式存放在表空间中的,而所谓的表空间只不过是InnoDB对文件系统上一个或几个实际文件的抽象,也就是说我们的数据说到底还是存储在磁盘上的。但是磁盘的速度慢,所以InnoDB存储引擎在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中,也就是说即使我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以进行读原创 2021-09-24 20:30:17 · 1109 阅读 · 0 评论 -
InnoDB表空间
表空间是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为表名.ibd的实际文件。大家可以把表空间想象成被切分为许许多多个页的池子,当我们想为某个表插入一条记录的时候,就从池子中捞出一个对应的页来把数据写进去。再回忆一次,InnoDB是以页为单位管理存储空间的,我们的聚簇索引(也就是完整的表数据)和其他的二级索引都是以B+树的形式保存到表空间的,而B+树的节点就是数据页。任何类型的页都有File Header这个部分,File Hea原创 2021-09-24 20:28:49 · 552 阅读 · 0 评论 -
InnoDB索引页结构
InnoDB是一个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。而真正处理数据的过程是发生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,和内存读写差了几个数量级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要一条一条的把记录从磁盘上读出来么?InnoDB采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为16KB。也就原创 2021-09-19 20:01:28 · 2854 阅读 · 0 评论 -
MySQL对子查询的优化
子查询语法在一个查询语句A里的某个位置也可以有另一个查询语句B,这个出现在A语句的某个位置中的查询B就被称为子查询,A也被称之为外层查询。子查询可以在一个外层查询的各种位置出现,子查询出现在SELECT子句中也就是我们平时说的查询列表中,比如这样:SELECT (SELECT m1 FROM e1 LIMIT 1);其中的(SELECT m1 FROM e1 LIMIT 1)就是子查询。子查询出现在FROM子句中比如:SELECT m, n FROM (SELECT m2 + 1 AS原创 2021-09-13 20:18:11 · 16505 阅读 · 0 评论 -
MySQL的查询重写规则
对于一些执行起来十分耗费性能的语句,MySQL 还是依据一些规则,竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式,这个过程也可以被称作查询重写。条件化简我们编写的查询语句的搜索条件本质上是一个表达式,这些表达式可能比较繁杂,或者不能高效的执行,MySQL的查询优化器会为我们简化这些表达式。移除不必要的括号有时候表达式里有许多无用的括号,比如这样:((a = 5 AND b = c) OR ((a > c) AND (c < 5)))看着就很烦,优化器会把那些用不原创 2021-09-13 20:16:08 · 19685 阅读 · 0 评论 -
MySQL中的统计数据
基于索引统计数据的成本计算有时候使用索引执行查询时会有许多单点区间,例如使用in语句就很容易产生非常多的单点区间,比如下边这个查询(下边查询语句中的…表示还有很多参数): select * from t_emp where hire_date in ('1890-11-10','1990-12-10'...'1991-11-12');很显然,这个查询可能使用到的索引就是idx_hire_date,由于这个索引并不是唯一的二级索引,所以并不能确定一个单点区间对应的二级索引记录的条数有多少,需要我们去计原创 2021-09-06 21:16:56 · 23287 阅读 · 0 评论 -
MySQL连接查询的成本
Condition filtering介绍连接查询至少是要有两个表的,这里使用的是t_emp和salaries。我们前边说过,MySQL中连接查询采用的是嵌套循环连接算法,驱动表会被访问一次,被驱动表可能会被访问多次,所以对于两表连接查询来说,它的查询成本由下边两个部分构成:单次查询驱动表的成本多次查询被驱动表的成本(具体查询多少次取决于对驱动表查询的结果集中有多少条记录)对驱动表进行查询后得到的记录条数称之为驱动表的扇出(fanout)。很显然驱动表的扇出值越小,对被驱动表的查询次数原创 2021-08-29 21:15:45 · 2648 阅读 · 1 评论 -
一条SQL语句执行成本的计算
在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案,这个成本最低的方案就是所谓的执行计划,之后才会调用存储引擎提供的接口真正的执行查询。准备数据employees数据库来自MySQL官方示例数据库employees。mysql> use employees;Reading table information for completion of table and column namesYou can turn off thi原创 2021-08-27 20:49:13 · 1355 阅读 · 0 评论 -
MySQL优化器成本记录表
SQL优化器会分析所有可能的执行计划,选择成本最低的执行,这种优化器称之为:CBO(Cost-based Optimizer,基于成本的优化器)。什么是成本MySQL执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模糊的,其实在MySQL中一条查询语句的执行成本是由下边这两个方面组成的:IO成本我们的表经常使用的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数原创 2021-08-18 20:26:43 · 13559 阅读 · 1 评论 -
MySQL中的连接查询
对于本文章,所用的表为student表和score表:mysql> create table student(id int, name varchar(20));mysql> insert into student values(1, "morris"), (2, "bob"), (3, "tom"), (4, "jack");mysql> create table score(id int, score int);mysql> insert into score valu原创 2021-08-11 20:40:46 · 3554 阅读 · 0 评论 -
MySQL官方示例数据库的使用
官网介绍:https://dev.mysql.com/doc/index-other.htmlmysql官网提供了如下示例数据库:其中最常用的数据库为employee data和sakila。下面以employee为例展示怎么导入这个数据库。1、下载数据库脚本,下载地址:https://github.com/datacharmer/test_db2、将压缩包解压,这里是使用的docker,所以还需要复制到docker容器中:# docker cp /mnt/d/360极速浏览器下载/test原创 2021-08-09 22:01:46 · 14906 阅读 · 0 评论 -
MySQL中的B+树索引结构
B树B树(B-tree、B-树):是一种平衡的多路搜索树,多用于文件系统、数据库的实现。B树的特点:1个节点可以存储超过2个元素、可以拥有超过2个子节点;拥有二叉搜索树的一些性质(有序性);平衡,每个节点的所有子树高度一致;树的整体高度较低。m阶B树的性质(m≥2)m阶表示节点允许有m个子节点,节点元素的个数可以有m-1个。3阶B树:4阶B树:B+树B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。原创 2021-08-08 19:13:10 · 18042 阅读 · 0 评论 -
数据库设计之范式与反范式
范式设计什么是范式?范式来自英文Normal Form,简称NF。要想表之间设计—个好的关系,必须使关系满足一定的约束条件,此约束已经形成了规范,分成几个等级,一级比一级要求得严格。满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴原创 2021-05-20 20:31:06 · 1815 阅读 · 0 评论 -
MySQL数据类型之JSON
JSON类型是MySQL 5.7版本新增的数据类型,用好JSON数据类型可以有效解决很多业务中实际问题。使用JSON数据类型,推荐用MySQL 8.0.17以上的版本,性能更好,同时也支持Multi-Valued Indexes;JSON数据类型的好处是无须预先定义列,数据本身就具有很好的描述性;不要将有明显关系型的数据用JSON存储,如用户余额、用户姓名、用户身份证等,这些都是每个用户必须包含的数据;JSON数据类型推荐使用在不经常更新的静态数据存储。JSON数据类型mys原创 2021-05-18 21:06:43 · 1085 阅读 · 1 评论