MySQL 数据库

前言

MySQL 是⼀种关系型数据库,在Java企业级开发中⾮常常⽤,因为 MySQL 是开源免费的,并且⽅便扩展。MySQL的默认端⼝号是3306。

一、存储引擎

查看MySQL提供的所有存储引擎

show engines;

查询结果

在这里插入图片描述

从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中
只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB ⽀持事务。

查看MySQL当前默认的存储引擎

show variables like '%storage_engine%';

查询结果

在这里插入图片描述

查看表的存储引擎

show table status like "yang" ;

查询结果

在这里插入图片描述

MyISAM和InnoDB区别

MyISAM是MySQL的默认数据库引擎(5.5版之前)。5.5版本之后,MySQL引入了InnoDB(事务性数据库引擎),MySQL5.5版本后默认的存储引擎为InnoDB。

  1. 是否支持行级锁: MyISAM 只有表级锁,InnoDB 支持行级锁和表级锁,默认为行级锁。
  2. 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快,但是不提供事务支持。但是InnoDB 提供事务支持事务,外部键等高级数据库能。 是具有事务、回滚和崩溃修复能力的事务安全型表。
  3. 是否支持外键: MyISAM不支持,InnoDB支持。
  4. 是否支持MVCC :仅 InnoDB 支持。MVCC意思为多版本并发控制,应对高并发事务,MVCC比单纯的加锁更⾼效,MVCC只在读已提交(RC) 和 可重复读(RR) 两个隔离级别下工作。用更好的方式去处理读写冲突。

二、字符集及校对规则

字符集:对文字的编码方式
校对规则:判断一段文字是否相等的比较方式

字符集

字符集说明
uft-88进制UTF编码,支持所有语言
gbk支持简体中文及繁体中文
gb2312支持简体中文
big5支持繁体中文

校验规则

校验规则说明
utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写
utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感
utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感

显示mysql支持的所有字符集

show charset;

显示mysql支持的所有的校对集

show collattion;

显示当前数据库使用的校检规则

show variables like "collation_%";

三、mysql 索引

https://blog.csdn.net/yy139926/article/details/124443946

四、查询缓存

执行查询语句的时候,会先查询缓存。不过,MySQL 8.0 版本后移除,因为这个功能不太实用。

开启查询缓存

① my.cnf加入以下配置,重启MySQL开启查询缓存

query_cache_type=1
query_cache_size=600000

② MySQL执行以下命令也可以开启查询缓存

set global query_cache_type=1;
set global query_cache_size=600000;

开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等⼀些可能影响结果的信息。如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL库中的系统表,其查询结果也不会被缓存。

缓存建立之后,MySQL的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做⼀次缓存操作,失效后还要销毁。 因此,如果开启,要注意合理控制缓存空间大小,⼀般来说其⼤小设置为几十MB比较合适。此外,还可以通过sql_cache和sql_no_cache来控制某个查询语句是否需要缓存:

select sql_no_cache count(*) from usr;

五、事务和锁

https://blog.csdn.net/yy139926/article/details/124582264

六、大表优化

当MySQL单表记录数过⼤时,数据库的CRUD性能会明显下降,⼀些常见的优化措施如下:

限定数据的范围

务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在⼀个⽉的范围内。

读/写分离

经典的数据库拆分分案,主库负责写,从库负责读。

垂直分区

根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。简单来说垂直拆分是指数据表列的拆分,把⼀张列比较多的表拆分为多张表。

在这里插入图片描述

垂直拆分的优点: 可以使得列数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。

垂直拆分的缺点: 主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂。

水平分区

保持数据表结构不变,通过某种策略存储数据分片。这样每⼀片数据分散到不同的表或者库中,达到了分布式的目的。 水平拆分可以支撑非常大的数据量。水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把⼀张的表的数据拆成多张表来存放。举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单⼀表数据量过⼤对性能造成影响。

在这里插入图片描述

⽔平拆分可以⽀持非常⼤的数据量。需要注意的⼀点是:分表仅仅是解决了单⼀表数据过大的问题,但由于表的数据还是在同⼀台机器上,其实对于提升MySQL并发能力没有什么意义,所以水平拆分最好分库 。

七、数据库连接池

https://blog.csdn.net/yy139926/article/details/128837035

八、SQL语句在MySQL中如何执行

请添加图片描述

  1. 连接器

主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即时管理员修改了该用户的权限,该用户也是不受影响的。

  1. 查询缓存(MySQL 8.0 版本后移除)

查询缓存主要用来缓存我们所执行的 SELECT 语句以及该语句的结果集。

连接建立后,执行查询语句的时候,会先查询缓存,MySQL 会先校验这个 sql 是否执行过,以 Key-Value 的形式缓存在内存中,Key 是查询预计,Value 是结果集。如果缓存 key 被命中,就会直接返回给客户端,如果没有命中,就会执行后续的操作,完成后也会把结果缓存起来,方便下一次调用。当然在真正执行缓存查询的时候还是会校验用户的权限,是否有该表的查询条件。

MySQL 查询不建议使用缓存,因为查询缓存失效在实际业务场景中可能会非常频繁,假如你对一个表更新的话,这个表上的所有的查询缓存都会被清空。对于不经常更新的数据来说,使用缓存还是可以的。所以,一般在大多数情况下我们都是不推荐去使用查询缓存的。

  1. 分析器

MySQL 没有命中缓存,那么就会进入分析器,分析器主要是用来分析 SQL 语句是来干嘛的,分析器也会分为几步:

第一步,词法分析,一条 SQL 语句有多个字符串组成,首先要提取关键字,比如 select,提出查询的表,提出字段名,提出查询条件等等。做完这些操作后,就会进入第二步。

第二步,语法分析,主要就是判断你输入的 sql 是否正确,是否符合 MySQL 的语法。

完成这 2 步之后,MySQL 就准备开始执行了,但是如何执行,怎么执行是最好的结果呢?这个时候就需要优化器上场了。

  1. 优化器

优化器的作用就是它认为的最优的执行方案去执行,比如多个索引的时候该如何选择索引,多表查询的时候如何选择关联顺序等。可以说,经过了优化器之后可以说这个语句具体该如何执行就已经定下来。

  1. 执行器

当选择了执行方案后,MySQL 就准备开始执行了,首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎的接口,返回接口执行的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值