MySQL高级学习笔记

1、MySQL架构组成

1.1 高级MySQL介绍

什么是DBA?

  • 数据库管理员,英文是Database Administrator,简称DBA;

百度百科介绍
数据库管理员(简称DBA),是从事管理和维护数据库管理系统(DBMS)的工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。

DBA的核心目标是保证数据库管理系统的稳定性、安全性、完整性和高性能。

在国外,也有公司把DBA称作数据库工程师(Database Engineer),两者的工作内容基本相同,都是保证数据库服务7*24小时的稳定高效运转,但是需要区分一下DBA和数据库开发工程师
1、数据库开发工程师的主要职责是设计和开发数据库管理系统和数据库应用软件系统,侧重于软件研发;
2、DBA的主要职责是运维和管理数据库管理系统,侧重于运维管理;

一个高级DBA的职责:

  • 负责MySQL的容量规划,架构设计及安装、部署;
  • 负责MySQL的日常管理,监控和维护,并对MySQL进行持续性能优化;
  • 负责MySQL开发支持,参与数据架构规划设计,以及相关业务的数据建模、设计评审、SQL代码审核优化;

中级Java开发工程师对数据库知识的掌握程度

  • 熟练操作主流数据库,能够通过代码(框架)完成日常的数据库操作;
  • 熟练使用SQL,熟悉SQL优化,熟悉存储过程、视图等创建及使用;
  • 了解MySQL的整体体系结构,了解MySQL事务、存储引擎的特点;
  • 了解MySQL索引优化,了解MySQL相关锁机制;

我们作为Java开发工程师,关注的应该是跟开发相关的数据库知识,了解这些高级的知识,目的是让我们编写出更加高效的应用程序;

专业的数据库维护、服务器优化、性能参数调优等等数据库相关的运维工作还是要交给DBA去做的。



1.2 MySQL逻辑架构

学习MySQL就好比盖房子,如果想把房子盖的特别高,地基一定要稳,基础一定要牢固。学习MySQL数据库前要先了解它的体系结构,这是学好MySQL数据库的前提。

1.2.1 MySQL架构体系介绍

MySQL由链接池、SQL接口、解析器、优化器、缓存、存储引擎等组成,可以分为四层,即连接层、服务层、引擎层和文件系统层。

  • 如下是官方文档中MySQL的基础架构图:
    在这里插入图片描述

1、连接层
最上面是一些客户端和连接服务,不是MySQL特有的,所有基于网络的C/S的网络应用程序都应该包括连接处理、认证、安全管理等。

2、服务层
中间层是MySQL的核心,包括查询解析、分析、优化和缓存等。同时它还提供跨存储引擎的功能,包括存储过程、触发器和视图等。

3、引擎层
存储引擎层,它负责存取数据。服务器通过API可以和各种存储引擎进行交互。不同的存储引擎具有不同的功能,我们可以根据实际需求选择使用对应的存储引擎。

4、存储层
数据存储层,主要是将数据存储与运行与裸设备的文件系统之上,并完成与存储引擎的交互。


1.2.2 SQL查询流程

我们用一条SQL SELECT语句的执行轨迹里来说明客户端与MySQL的交互过程,如下图所示。
在这里插入图片描述

1)通过客户端/服务器通信协议与MySQL建立连接;

2)查询缓存,这是MySQL的一个可优化查询的地方,如果开启了Query Cache且在查询缓存过程中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;如果没有开启Query Cache或者没有查询到完全相同的SQL语句,则会由解析器进行语法语义解析,并声称过解析树;

3)预处理器声生成新的解析树;

4)查询优化器生成执行计划;

5)查询执行引擎执行SQL语句,此时查询执行引擎会根据SQL语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互情况,得到查询结果,由MySQL Server过滤后将查询结果缓存并返回给客户端。若开启了Query Cache,这时也会将SQL语句和结果完整地保存到Query Cache中,以后若有相同的SQL语句执行则直接返回结果;



1.3 MySQL物理文件

物理文件包括:日志文件,数据文件,配置文件;

1.3.1 日志文件

日志文件包括:

  • error log:错误日志 排错 /var/log/mysqld.log【默认开启】;
  • bin log:二进制日志 备份 增量备份 DDL DML DCL;
  • relay log:中继日志 复制 接收replication master;
  • slow log:慢查询日志 调优 查询时间超过指定值;
-- 查看错误日志文件路径
show variables like 'log_error';

-- 慢查询日志文件路径
show variables like 'slow_query_log_file';

-- bin log日志文件 需要在my.cnf中配置
log-bin=/var/log/mysql-bin/bin.log
server-id=2

-- 查看relay log相关参数
show variables like '%relay%'

1.3.2 配置文件&数据文件

1)配置文件my.cnf
在my.cnf文件中可以进行一些参数设置,对数据库进行调优。

[client]                                     #客户端设置,即客户端默认的连接参数
port = 3307                                  #默认连接端口
socket = /data/mysqldata/3307/mysql.sock     #用于本地连接的socket套接字
default-character-set = utf8mb4              #编码

[mysqld]                                     #服务端基本设置
port = 3307                                  #mysql监听端口
socket = /data/mysqldata/3307/mysql.sock     #为mysql客户端程序和服务器之间的本地通讯指定一个套接字文件
pid-file = /data/mysqlldata/3307/mysql.pid   #pid文件所在目录
basedir = /usr/local/mysqll-5.7.11           #使用该目录作为根目录(安装目录)
datadir = /data/mysqldata/3307/data          #数据文件存放的目录
tmpdir = /data/mysqldata/3307/tmp            #mysql存放临时文件的目录
character_set_server = utf8mb4               #服务端默认编码(数据库级别)

2)数据文件

-- 查看数据文件的位置
show variables like '%dir%';

1、.frm文件
不论是什么存储引擎,每一个表都会有一个以表名命名的.frm文件,与表相关的元数据信息都存放在此文件中,包括表结构的定义信息等;

2、.myd文件
myisam存储引擎专用,存放myisam表的数据(data)。每一个myisam表都会有一个.myd文件与之呼应,同样存放在所属数据库的目录下;

3、.myi文件
也就是myisam存储引擎专用,存放myisam表的索引相关信息。每一个myisam表对应一个.myi文件,其存放的位置和.frm及.myd一样

4、.ibd文件
存放innoDB的数据文件(包括索引)

5、db.opt文件
此文件在每一个自建的库里都会有,记录这个库的默认使用的字符集和校验规则;




2.MySQL的备份与恢复

2.1 为什么要进行数据备份

我们试想一下,在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新,软件问题可以修复或重新安装,但是如果数据没了呢,对于一些网站、系统来说,数据库就是一切,所以做好数据库的备份是至关重要的!

2.1.1 数据库备份的应用场景

数据备份在很多工作中都是经常会用到的,因为数据容易因为各种原因而丢失,造成数据丢失的原因有哪些呢?

  • 数据丢失应用场景
    • 系统硬件或软件故障
    • 自然灾害,比如水灾、火灾、地震等
    • 黑客攻击,非法访问者故意破坏
    • 误操作,认为的误操作占比最大
      在这里插入图片描述
  • 非数据丢失应用场景:
    • 开发测试环境数据库搭建
    • 数据库或者数据迁移


2.2 数据备份的类型

2.2.1 按照业务方式分

完全备份
将数据库的全部信息进行备份,包括数据库的数据文件、日志文件,还需要备份数据的存储位置以及数据库中的全部对象和相关信息。

差异备份
备份从最近的完全备份后对数据所做的修改,备份完全备份后变化了的数据文件、日志文件以及数据库中其他被修改的内容。

增量备份
增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。
在这里插入图片描述

完全备份差异备份增量备份
备份方法备份所有文件一次全备份后,备份与全备份差异的部分一次全备份后与上次备份的差异部分
备份速度最慢较快最快
恢复速度最快较快最慢
空间要求最多较多最少
优势最快的恢复速度,只需要上一次完全备份就能恢复相比增量,更快也更简单并且只需要最近一次的完全备份和最后一次的差异备份就能恢复备份速度快,较少的空间需求,没有重复的备份文件
劣势最多的空间需求,大量重复的备份较慢的备份速度,仍然会存在许多的备份文件最慢的恢复速度,恢复需要最近一次完全备份和全部增量备份

2.2.2 备份的组合方式

完全备份与差异备份
以每周数据备份为例,可以在星期一进行完全备份,在星期二至星期六进行差异备份。如果在星期六数据被破坏了,则只需要还原星期一完全的备份和星期五的差异备份。

这种策略备份数据需要较多的时间,但还原数据使用较少的时间。
在这里插入图片描述

完全备份与增量备份
以每周数据备份为例,在星期一进行完全备份,在星期二至星期六进行增量备份。如果在星期六数据被破坏了,则需要还原星期一正常的备份和从星期二至星期五的所有增量备份。

这种策略备份数据需要较少的时间,但还原数据使用较长的时间。
在这里插入图片描述



2.3 MySQL冷备份和热备份

冷备份与热备份指的是,按照数据库的运行状态分类;

2.3.1 冷备份

冷备份指的是当数据库进行备份时,数据库不能进行读写操作,即数据库要下线;
在这里插入图片描述
冷备份的优点:

  • 是操作比较方便的备份方法(只需拷贝文件)
  • 低度维护,高度安全

冷备份的缺点:

  • 在实施备份的全过程中,数据库必须要作备份而不能作其他工作;
  • 若磁盘空间有限,只能拷贝到磁带等其他外部存储设备上,速度比较慢;
  • 不能按表或按用户恢复;

2.3.2 热备份

热备份
热备份是在数据库运行的情况下,备份数据库操作的SQL语句,当数据库发生问题时,可以重新执行一遍备份的sql语句。
在这里插入图片描述
热备份的优点:

  • 可在表空间或数据文件级备份,备份时间短;
  • 备份时数据库仍可使用;
  • 可达到秒级恢复(恢复到某一时间点上);

热备份的缺点:

  • 不能出错,否则后果严重;
  • 因难维护,所以要特别仔细小心,不允许“以失败而告终”;


2.4 实战演练

2.4.1 冷备份实战

1、关闭SELinux
修改selinux配置文件,将SELINUX=enforcing改成SELINUX=disabled,保存后退出;

vim /etc/selinux/config
SELINUX=disabled

修改后需要重启

reboot # 重启命令

2、找到MySQL数据文件位置,停止MySQL服务;

show variables like '%dir%';

-- 结果显示,数据目录就是datadir的所在位置,即/var/lib/mysql/

service mysqld stop -- 停止mysql

3、进入到/mysql目录,执行打包命令,将数据文件打包备份;

cd /var/lib/ # 进入其上级目录
tar jcvf /root/backup.tar.bz2 mysql/  #打包压缩到root目录下

4、删除掉数据目录下的所有数据

rm -rf /var/lib/mysql/

5、恢复数据(使用tar命令)

-- 解压
tar jxvf backup.tar.bz2 mysql/

-- 把备份的文件移动到/var/lib里面去替代原来的mysql
mv /root/mysql/ /var/lib/

6、启动MySQL,然后登录MySQL,查看数据是否丢失,如果数据正常代表冷备份成功;

service mysqld start

2.4.2 热备份实战

mysqldump备份工具
mysqldump是MySQL数据库用来备份和数据转移的一个工具,一般在数据量很小的时候(几个G)可以用于备份。热备份可以对多个库进行备份,可以对单张表活着某几张表进行备份。

备份单个数据库
1、创建文件夹,备份数据;

mkdir databackup
cd databackup
mysqldump -uroot -p lagou_edu > lagou_edu.sql

2、模拟数据丢失,删除数据库,然后重新创建一个新的库;

drop database lagou_edu;
create database lagou_edu character set 'utf8';

3、恢复数据

cd databackup
mysql -uroot -p lagou_edu < lagou_edu.sql

备份数据库的某些表
1、备份表数据

mysqldump -uroot -p lagou_edu course course_lesson > backupTable.sql

2、模拟数据丢失,删除数据表

drop table course;
drop table course_lesson;

3、恢复数据

mysql -uroot -p lagou_edu < backupTable.sql

直接将MySQL数据库压缩备份
1、备份数据

mysqldump -uroot -p lagou_edu | gzip > lagou_edu.sql.gz

2、模拟数据丢失,删除数据库

drop database lagou_edu;
create database lagou_edu character set 'utf8';

3、恢复数据

gunzip < lagou_edu.sql.gz | mysql -uroot -p lagou_edu



3.MySQL查询和慢查询日志分析

3.1 SQL性能下降的原因

在日常的运维过程中,经常会遇到DBA将一些执行效率较低的SQL发过来找开发人员分析,当我们拿到这个SQL语句之后,在对这些SQL进行分析之前,需要明确可能导致SQL执行性能下降的原因进行分析,执行性能下降可以提现在以下两个方面:

1、等待时间长
锁表导致查询一直处于等待状态,后续我们从MySQL锁的机制去分析SQL执行的原理;

2、执行时间长
a. 查询语句写的烂;
b. 索引失效;
c. 关联查询太多join;
d. 服务器调优及各个参数的设置;



3.2 需要遵守的优化原则

查询优化是一个复杂的工程,涉及从硬件到参数配置、不同数据库的解析器、优化器实现、SQL语句的执行顺序,索引以及统计信息的采集等等方面。

下面给大家介绍几个编写SQL的关键原则,可以帮助我们编写出更加高效的SQL查询:

  • 第一条:只返回需要的结果
    • 一定要为查询语句指定where条件,过滤掉不需要的数据行;
    • 避免使用select * from,因为它表示查询表中的所有字段;
  • 第二条:确保查询使用了正确的索引
    • 经常出现在WHERE条件中的字段建立索引,可以避免全表扫描;
    • 将order by排序的字段加入到索引中,可以避免额外的排序操作;
    • 多表连接查询的关联字段建立索引,可以提高连接查询的性能;
    • 将group by分组操作字段加入到索引中,可以利用索引完成分组;
  • 第三条:避免让索引失效
    • 在where子句中对索引字段进行表达式运算或者使用函数都会导致索引失效;
    • 使用like匹配时,如果通配符出现在左侧,则无法使用索引;
    • 如果where条件中的字段上创建了索引,尽量设置为not null;


3.3 SQL的执行顺序

程序员编写的SQL

select distinct <select_list>

from <left_table> <join_type>

join <right_table> on <join_condition>

where <where_condition>

group by <group_by_list>

having <having_condition>

order by <order_by_condition>

limit <limit_number>

MySQL执行的SQL

1from <left_table> <join_type>

2on <join_condition>

3<join_type> join <right_table>

4where <where_condition>

5group by <group_by_list>

6having <having_condition>

7select

8distinct <select_list>

9order by <order_by_condition>

10limit <limit_number>

1、from子句:左右两个表的笛卡尔积;
2、on:筛选满足条件的数据;
3、join:如果是inner join那就正常,如果是outer join则会添加回来上面一步过滤掉的一些行;
4、where:对不满足条件的行进行移除,并且不能恢复;
5、group by:分组后只能得到每组的第一行数据,或者聚合函数的数值;
6、having:对分组后的数据进行筛选;
7、select:执行select操作,获取需要的列;
8、distinct:去重;
9、order by:排序;
10、limit:取出指定行的记录,并将结果返回;

注意:mysql在没有建立索引的情况下,执行查询时,会进行全表扫描;

查看下面的SQL分析执行顺序

select
    id,
    sex,
    count(*) AS num
from
    employee
where name is not null
group by sex
order by id

上面的SQL执行顺序如下:
1、首先执行from子句,从employee表组装数据源的数据;
2、执行where子句,筛选employee表中所有name不为null的数据;
3、执行group by子句,按“性别”列进行分组;
4、执行select操作,获取需要的列;
5、最后执行order by,对最终的结果进行排序;



3.4 join查询的七种方式

7种join,可以分为四类:内连接左连接右连接全连接
在这里插入图片描述



3.5 join查询sql编写

1、创建表 插入数据

---部门表
DROP TABLE IF EXISTS `t_dept`; CREATE TABLE `t_dept` (
  `id` varchar(40) NOT NULL,
  `name` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

---员工表
DROP TABLE IF EXISTS `t_emp`; CREATE TABLE `t_emp` (
  `id` varchar(40) NOT NULL,
  `name` varchar(40) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `deptid` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `deptid` (`deptid`),
  CONSTRAINT `deptid` FOREIGN KEY (`deptid`) REFERENCES `t_dept` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--插入部门数据
INSERT INTO `t_dept` VALUES ('1', '研发部'); 
INSERT INTO `t_dept` VALUES ('2', '人事部'); 
INSERT INTO `t_dept` VALUES ('3', '财务部');

--插入员工数据
INSERT INTO `t_emp` VALUES ('1', '赵四', 23, '1'); 
INSERT INTO `t_emp` VALUES ('2', '刘能', 25, '2'); 
INSERT INTO `t_emp` VALUES ('3', '广坤', 27, '1'); 
INSERT INTO `t_emp` VALUES ('4', '玉田', 43, NULL);

3.5.1 内连接

在这里插入图片描述

select * from t_emp e inner join t_dept d on e.deptid = d.id

3.5.2 左连接

在这里插入图片描述

select * from t_emp e left join t_dept d on e.deptid = d.id

3.5.3 左连接去重叠部分

在这里插入图片描述

select * from t_emp e left join t_dept d on e.deptid = d.id and e.deptid is null;

### 3.5.4 右连接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/39261c2ae5f842bc8a92077f1da0391e.png) ```sql select * from t_emp e right join t_dept d on e.deptid = d.id; ```

右连接去重叠部分

在这里插入图片描述

select * from t_emp e right join t_dept d on e.deptid = d.id and e.id is null;

3.5.6 全连接

在这里插入图片描述

SELECT * FROM t_emp e LEFT JOIN t_dept d ON e.deptid = d.id
UNION
SELECT * FROM t_emp e RIGHT JOIN t_dept d ON e.deptid = d.id

MySQL union操作符用于连接两个以上的select语句的结果组合到一个结果集合中。多个select语句会删除重复的数据。

3.5.7 各自独有

在这里插入图片描述

SELECT * FROM t_emp e LEFT JOIN t_dept d ON e.deptid = d.id
WHERE e.deptid IS NULL
UNION
SELECT * FROM t_emp e RIGHT JOIN t_dept d ON e.deptid = d.id
WHERE e.id IS NULL


3.6 慢查询日志分析

3.6.1 慢查询介绍

MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阈值的语句。

默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数。

如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。

慢查询日志支持将日志记录写入文件和数据库表。

3.6.2 慢查询参数

1)执行下面的语句

show variables like "%query%";

2)MySQL慢查询的相关参数解释:

  • slow_query_log:是否开启慢查询日志, 1-表示开启 0-表示关闭;
  • slow_query_log_file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径;
  • long_query_time:慢查询阈值,当查询时间多于设定的阈值时,记录日志;

3.6.3 慢查询配置方式

1、默认情况下slow_query_log的值为off,表示慢查询日志是禁用的

mysql> show variables like '%slow_query_log%';

2、可以通过设置slow_query_log的值来开启

mysql> set global slow_query_log=1;

mysql> show variables like '%slow_query_log%';

3、使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf(其他系统变量也是如此)

-- 编辑配置
vim /etc/my.cnf

-- 添加如下内容
slow_query_log =1
slow_query_log_file=/var/lib/mysql/lagou-slow.log

-- 重启mysql
service mysqld restart 

mysql> show variables like '%slow_query_log%';

4、那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢?这个是由参数long_query_time控制,默认情况下long_quuery_time的值为10秒;

mysql> show variables like 'long_query_time';

mysql> set global long_query_time =1;

mysql> show variables like 'long_query_time'; ## 查询出来还是10s

5、我修改了变量long_query_time,但是查询变量long_query_time的值还是10,难道没有修改到?注意:使用命令set global long_query_time=1修改后,需要重新连接或新开一个会话才能看到修改值;

6、log_output参数是指定日志的存储方式。log_output='FILE’表示将日志存入文件,默认值是‘FILE’。log_output='TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.show_log表中。

MySQL数据库支持同时两种日志的存储方式,配置的时候以逗号隔开即可,如:log_ouutput=‘FILE,TABLE’。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要开启慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。

7、系统变量log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。

set global log_queries_not_using_indexes=1;



4.MySQL存储引擎

4.1 存储引擎介绍

什么是存储引擎
百度百科:MySQL中的数据用各种不同的技术存储在文件(或内存)中。这些技术中的每一种技术都使用不同的存储引擎、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获取额外的速度或者功能,从而改善你的应用的整体功能。

存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。就像汽车的发动机一样,存储引擎好坏,决定数据库提供的功能和性能;

存储引擎的作用

  • 并发性
  • 事务支持
  • 引用完整性
  • 索引支持



4.2 常见的3种存储引擎

MySQL给用户提供了很多种类的存储引擎,主要分两大类:

  • 事务安全表:InnoDB
  • 非食物安全表:MyISAM、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等。

1、查看MySQL数据的存储引擎有哪些

show engines;

在这里插入图片描述

2、查看当前的默认存储引擎(MySQL5.7 默认使用InnoDB)

show variables like '%default_storage_engine%';

在这里插入图片描述
3、在MySQL中,不需要整个服务器都是用同一种引擎,针对具体的要求,可以对每一个表使用不同的存储引擎,并且想要进一步优化,还可以自己编写一个存储引擎。

-- 创建新表时指定存储引擎
create table() engine=MyISAM;

4.2.1 InnoDB(推荐)

InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择;

  • 优点

    • Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离界别;
    • 支持多版本并发控制的行级锁,由于锁粒度小,写操作和更新操作并发高、速度快;
    • 支持自增长列;
    • 支持外键;
    • 适合于大容量数据库系统,支持自动灾难恢复;
  • 缺点

    • 它没有保存表的行数,当select count(*) from table时需要扫描全表;
  • 应用场景

    • 当需要使用数据库事务时,该引擎当然是首选,由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率;
    • 更新密集的表,InnoDB存储引擎特别适合处理多重并发的更新请求;

4.2.2 MyISAM

MyISAM引擎不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有要求或者以select、insert为主的应用基本上可以用这个引擎来创建表

  • 优点
    • MyISAM表是独立于操作系统的,这说明可以轻松地将其从windows服务器移植到Linux服务器;
    • MyISAM存储引擎在查询大量数据时非常迅速,这是它最突出的优点;
    • 另外进行大批量插入操作时执行速度也比较快;
  • 缺点
    • MyISAM表没有提供对数据库事务的支持;
    • 不支持行级锁和外键;
    • 不适合用于经常update(更新)的表,效率低;
  • 应用场景
    • 以读为主的业务,例如:图片信息数据库,博客数据库,商品库等业务;
    • 对数据一致性要求不是非常高的业务(不支持事务);
    • 硬件资源比较差的机器可以用MyISAM(占用资源少)

4.2.3 MEMORY

MEMORY的特点是将表中的数据放在内存中,适用于存储临时数据的临时表和数据仓库中的维度表;

  • 优点
    • memory类型的表访问非常的快,因为它的数据是存放在内存中的;
  • 缺点
    • 一旦服务关闭,表中的数据就会丢失掉;
    • 只支持表锁,并发性能差,不支持TEXT和BLOB列类型,存储varchar时是按照char的方式;
  • 应用场景
    • 目标数据较小,而且被非常频繁的访问;
    • 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中;
    • 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响;


4.3 如何选择存储引擎

不同的存储引擎都有各自的特点,以适应不同的需求,如表所示。为了做出选择,首先要考虑每一个存储引擎提供了哪些不同的功能。

特征InnoDBMyISAMMEMORY
存储限制64TBNoYes
支持事务YesNoNo
锁机制行锁表锁表锁
B树索引YesYesYes
哈希索引YesNoYes
外键支持YesNoNo
存储空间消耗
内存消耗
批量数据写入效率

提供几个选择标准,然后按照标准,选择对应的存储引擎

  • 是否需要支持事务;
  • 崩溃恢复,能否接收崩溃;
  • 是否需要外键支持;
  • 存储的限制;
  • 对索引和缓存的支持;



5. MySQL索引优化

5.1 索引简介

5.1.1 什么是索引

索引就是排好序的,帮助我们进行快速查找的数据结构。

简单来说,索引就是一种将数据库中的记录按照特殊形式存储的数据结构。通过索引,能够显著地提高数据查询的效率,从而提升服务器的性能。

专业一点来说,索引是一个排好序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据库十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。
在这里插入图片描述
1、没有用索引时执行select * from table1 where name = ,数据从磁盘一条一条拿取最终找到结果,效率低下;
2、为了加快查找,可以维护一个二叉树,左侧节点小于父节点,右侧节点大于父节点,每个节点分别保存字段数据和一个指向对应数据记录物理地址的指针;
3、查找时,就可以使用二叉树查找获取相应的数据,从而快速检索出符合条件的记录;

一般来说索引本身也比较大,不可能全部保存在内存中,因此索引通常是以索引文件的形式存储在磁盘上。、


5.1.2 索引的种类

  • 普通索引
    • 这是最基本的索引类型,基于普通字段建立的索引,没有任何限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475884.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用PLCSIM Advanced仿真博途运动控制

作者顾工首先&#xff0c;添加一个CPU&#xff0c;直接添加一个1518T&#xff0c;反正仿真&#xff0c;不用最好的干嘛呢。是吧。当然&#xff0c;你也可以添加一个你喜欢的PLC&#xff0c;这里不强求。 然后添加工艺对象&#xff0c;我们简单添加一个定位轴。 在工艺对象&am…

php laravel 二维码

public function qr($url,$name2,$inpath){require_once(dirname(__FILE__) . /../../../Library/phpqrcode/phpqrcode.php);$errorCorrectionLevel L;//容错级别$matrixPointSize 10;//生成图片大小$QRcode new \QRcode() ;$QRcode->png($url, $inpath.$name2, $errorCor…

参数化学习

因为parameters的参数不能和数据驱动类使用&#xff0c;会出现报错&#xff0c;可以使用before test/等参数

NCV6323BMTAATBG同步降压转换器芯片中文资料规格书PDF数据手册参数引脚图图片

产品概述&#xff1a; NCV6323 是一款同步降压转换器&#xff0c;用于使用一个锂电池或三个碱性/镍镉/镍氢电池供电的便携式应用的各种子系统。此类器件能够基于外部可调电压提供高达 2 A 的电流。使用 3 MHz 开关频率的运行允许采用小尺寸电感器和电容器。采用输入电源电压前…

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板&#xff0c;13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题&#xff0c;标注&#xff0c;未来主义和线条标题&#xff0c;下三分之一&#xff0c;霓虹灯&#xff0c;带数字的标题&#xff0c;倒计时&#xff0c;表格&#xff0c…

Spring Cloud Alibaba微服务从入门到进阶(七)(服务容错-Sentinel)

雪崩效应 我们把基础服务故障&#xff0c;导致上层服务故障&#xff0c;并且这个故障不断放大的过程&#xff0c;成为雪崩效应。 雪崩效应&#xff0c;往往是因为服务没有做好容错造成的。 微服务常见容错方案 仓壁模式 比如让controller有自己独立的线程池&#xff0c;线程池满…

海外舆情监控的重要性以及云手机的推荐

海外市场不仅有着无尽的商机&#xff0c;同时也存在着各种各样的挑战。例如&#xff0c;海外市场舆情的复杂变化给企业带来了潜在风险&#xff0c;尤其在新媒体技术快速发展的时代&#xff0c;舆论对企业品牌形象的影响日益巨大。本文将详细探讨海外舆情监控的重要性以及为大家…

jmeter接口测试教程及接口测试流程详解

一、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过…

24.两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

Java程序设计 3 选择

布尔数据类型和逻辑运算符 boolean类型的值为true和false&#xff0c;其字面值也只有true和false&#xff08;也就是不能等同视为0和非零&#xff0c;这一点和C/C有所不同&#xff09;&#xff0c;且不能和其他数据类型混合运算&#xff08;包括类型转换&#xff09;。 Java里面…

【leetcode】67.二进制求和

前言&#xff1a;剑指offer刷题系列 问题&#xff1a; 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例&#xff1a; 输入&#xff1a;a "1010", b "1011" 输出&#xff1a;"10101"思路1&#xff1a; …

【面试题】HashMap为什么可以插入null而Hashtable就不可以(源码分析)

首先hashmap可以插入null值&#xff0c;但是hashtable和hashcurrentHashmap是不支持的&#xff1b;这是因为在 hashmap对插入key为null进行了特殊处理&#xff0c;当插入的值为null的时候会将哈希值设置为0 但是hashtable会直接抛出异常&#xff1a; 并且hashmap是线程不…

微信小程序选择器picker的使用(省市区)

index.wxml picker中的 moderegion模式&#xff0c;这里同element中的select不同的是&#xff0c;不需要自己在绑定数据原&#xff0c;默认就包含了省市区的整体数据 <view class"section"><view class"section__title">省市区选择器</vie…

13、Deconstructing Denoising Diffusion Models for Self-Supervised Learning

简介 研究了最初用于图像生成的去噪扩散模型(DDM)的表示学习能力 解构DDM&#xff0c;逐步将其转变为经典的去噪自动编码器(DAE) 探索现代ddm的各个组成部分如何影响自监督表征学习 结论&#xff1a; 只有很少的现代组件对于学习良好的表示是至关重要的&#xff0c;而其他许多…

2022年第13届蓝桥杯Java省赛B组-星期计算

一、题目 星期计算 【问题描述】 已知今天是星期六&#xff0c;请问 天后是星期几&#xff1f;注意用数字 1 到 7 表示星期一到星期日。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只填写这个…

算法|基础算法|大数取余

基础算法|暴力 大数取余 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 大数取余 大数取余&#xff0c; 从字符串的首位开始&#xf…

GESP图形化编程三级认证真题 2024年3月

GESP 图形化三级试卷 &#xff08;满分&#xff1a;100 分 考试时间&#xff1a;120 分钟&#xff09; 一、单选题&#xff08;一共 15 个题目&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 1、小杨的父母最近刚刚给他买了一块华为手表&#xff0c;他说手表上跑…

动态QCA|一条通向动态QCA产出的道路

一、动态QCA原理介绍 &#xff08;一&#xff09;动态QCA介绍 QCA&#xff08;Qualitative Comparative Analysis&#xff09;是一种定性比较分析方法&#xff0c;用于研究中小样本量的数据&#xff0c;旨在探索变量之间的复杂关系。在QCA中&#xff0c;研究者将变量分为二元变…

HarmonyOS ArkTS 开发基础/语言

目录 一、ArkUI (方舟开发框架) 概述 1.1 基本概念 1.2 两种开发范式 1.3 不同应用类型支持的开发范式 二、ArkTS 声明式开发范式 2.1 开发能力 2.2 整体架构 三、ArkTS 基础类型 3.1 Any 类型 3.2 数字类型 3.3 字符串类型 3.4 布尔类型 3.5 联合类型 3.6 数组类…

jackson解决java.lang.NoSuchMethodError

本质上是依赖版本冲突。 如&#xff1a;jackson-databind-2.11.2&#xff08;版本太低&#xff0c;需要升级版本&#xff09; jackson-core-2.12.6 jackson-dataformat-xml-2.12.6 idea用Analyze Dependencies插件 复制对应的groupId和artifactId放到exclusion里面 <grou…