MySQL面经

  • 1、基础
  • 1-1 MySQL数据库的优点
  • 1-2 三大范式
  • 1-3 事务 ACID原则
  • 1-4 Linux安装 MySQL有几种方式
  • 1-5 升级 MySQL,注意事项
  • 1-6 存储引擎如何选择
  • 1-7 事务隔离级别
  • inner、left join、right join、full outer join
  • 2、SQL
  • 2-1 SQL分类
  • 2-2 drop、delete、truncate区别
  • 2-3 MySQL的 6种关联查询
  • 2-4 MySQL 中 in和 exists区别
  • 2-5 基于 MySQL的 SQL生命周期
  • 3、运维
  • 3-1 MySQL的数据类型
  • 3-2 MySQL的约束
  • 3-3 索引的设计
  • 3-4 简述存储过程及其优点
  • 3-5 MySQL如何实现定时任务
  • 4、体系架构
  • 4-1 简述MySQL体系架构
  • 4-2 MySQL的参数文件位置以及如何配置
  • 4-3 MySQL 参数持久化文件
  • 4-4 socket是什么,如何使用 socket登录
  • 4-5 MySQL表结构定义文件
  • 4-6 错误日志如何配置
  • 4-7 慢查询日志是什么,如何配置
  • 4-8 Redo log和 Binlog区别
  • 5、备份数据库恢复
  • 5-1 MySQL备份方式
  • 5-2 PXB备份(Percona XtraBackup)
  • 5-3 MySQL表级的误操作之后,有哪些工具恢复数据
  • 5-4 MySQL常用备份工具
  • 5-5 MySQL备份计划如何确定
  • 5-6 数据表损坏的修复方法
  • 6、高可用
  • 6-1 主从复制作用及其解决的问题
  • 6-2 读写分离有哪些方案
  • 6-3 GTID
  • 6-3 MySQL常用中间件
  • 6-4 分库分表和表分区的区别
  • 7、性能优化
  • 7-1 主键采用自增 ID 还是 UUID
  • 8、故障处理
  • 8-1 root 密码忘记
  • 8-2 Binlog 满
  • 8-3 MySQL无法创建函数


1、基础

1-1 MySQL数据库的优点

体积小、速度快、跨平台、成本低、开放源代码、功能强大方便

1-2 三大范式

1NF:第一范式(确保每列保持原子性)
2NF:第二范式(确保表中的每列都和主键相关,完全依赖主键),在一范式的基础上消除非主属性对主码的部分函数依赖
3NF:第三范式(确保每列都和主键列直接相关,而不是间接相关),在二范式的基础上消除了传递性

1-3 事务 ACID原则

事务(Transaction)是由一系列对系统中数据进行访问或更新的操作所组成的一个程序执行逻辑单元(Unit)

  • A:原子性 不可分割性,事务中的操作要么全不做,要么全做
  • C:一致性 事务在执行前后,DB处于正确的状态,满足完整性约束
  • I:隔离性 多个事务并发时候,单个事务不影响其他事务的执行
  • D:持久性 事务处理完成,数据永久修改,即便系统故障也不会丢失

1-4 Linux安装 MySQL有几种方式

yum安装、rpm安装、常规方式编译安装、cmake方式编译安装、docker安装、通用二进制方式安装、源码安装

1-5 升级 MySQL,注意事项

1) mysqldump备份数据库,备份文件大约为120G
2) 停止MySQL 5.5数据库
3) 修改数据库端口重新启动数据库,比如从4308调整正为4318,使得迁移过程中避免其他业务连接的影响,验证无误后停库
4)修改mysql_base路径为5.7版本,修改/usr/bin/mysql等环境变量配置
5)替换配置文件为5.7版本,在5.7模式下启动数据库
6)使用upgrade模式升级数据字典,命令如下:
mysql_upgrade --socket=/data/mysql_4306/tmp/mysql.sock --port=4308 -uroot -pxxxx 7) 检查复核

1-6 存储引擎如何选择

  • InnoDB MySQL 5.5 版本之后默认的事务型引擎
    事务上具有优势,即支持具有提交、回滚和崩溃恢复能力的事务安装,所以占用空间较大
    应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,可以有效地降低由于删除和更新导致的锁定,还可以确保事务的完整提交(Commit)和回滚(Rollback),适用数据准确性要求比较高的系统
  • MyISAM MySQL 5.1 版本及之前的版本默认的存储引擎
    不支持事务和外键,但是访问速度快,以读取和写入为主,只有少量的更新和删除操作,并且对事务的完整性、并发性要求不是很高,常用于Web 数据仓储
  • MEMORY 存储引擎将所有数据保存在 RAM 中
    访问速度快,安全没有保障,表的大小有限制,太大的表无法缓存在内存中,所以要确保数据库异常终止后表中的数据可以恢复,适用数据量少,需要进行快速的访问

1-7 事务隔离级别

  • 事务并发的问题

脏读 当一个事务正在访问数据并且进行了修改,修改没有提交到DB中,此时另外一个事务访问并且使用了这个数据。

不可重复读 事务A多次读取同一数据,事务B在A读取的过程中对这个数据进行了修改并且提交,A在多次读取的时候,取出的数据不一致

幻读 DBA1修改数据的时候,DBA2在此时插入一条原先的数据,DBA1修改结束后发现有一条记录没有修改过来

四大隔离级别

  • 读未提交 脏读只在读未提交隔离级别才会出现,脏读:一个事务读到了另一个未提交事务修改过的数据
  • 读已提交 不可重复读在读未提交和读已提交隔离级别都可能会出现只能解决脏读的问题
  • 可重复读 每次读取的结果集都相同,不管其他事务有没有提交,可以解决脏读和不可重复读
  • 可串行化 隔离效果最好,解决了脏读,可重复读,幻读的问题。但是效果最差,它将事务变为顺序执行,mysql中事务隔离级别为serializable时会产生锁表,因此不会有幻读,但是并发量低,少用

inner、left join、right join、full outer join

mysql in性能问题用or替代_mysql

2、SQL

2-1 SQL分类

DQL 数据查询语言,select…from where…
DML 数据操作语言,insert,delete,update
DDL 数据定义语言,CREATE TABLE/VIEW/INDEX/SYN/CLUSTER,隐形提交,不可rollback
DCL 数据控制语言,grant,rollback,commit(显式提交,隐式提交,自动提交SET AUTOCOMMIT ON;

2-2 drop、delete、truncate区别

  • delete 删除内容,不删除定义,也不释放空间。
  • truncate 删除内容,释放空间,但不删除定义。(表结构还在,数据删除)
  • drop 连表数据和表结构一起删除

执行速度:drop > truncate > delete

2-3 MySQL的 6种关联查询

内联查询:inner join 和 join,两者效果相同
左外连接:left join
右外连接:right join
全连接:mysql不支持 full join,使用union替代

2-4 MySQL 中 in和 exists区别

exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,返回一个布尔值,速度快,效率高

《高性能MySQL》:MySQL把in的查询语句改成exists再去执行

in查询相当于多个or条件的叠加,它查询的子条件返回结果仅一个字段

2-5 基于 MySQL的 SQL生命周期

sql的执行过程和mysql体系架构基本一致

mysql in性能问题用or替代_数据库_02

连接器:建立与 MySQL 的连接,用于查询SQL语句,判断权限 。

查询缓存:一旦命中缓存,直接取出,提升效率,保留最新执行的缓存

分析器:对 SQL 语句进行硬解析,分析器先会做词法分析。

优化器:选择那个索引,选择那种连接方案等

执行器:
有索引:第一次调用的是取满足条件的第一行这个接口,之后循环取满足条件的下一行这个接口,最终把查询结果返回客户端
无索引:调用 InnoDB 引擎接口取这个表的第一行,判断sql查询条件,如果不是则跳过,如果是则将这行存在结果集中; 调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行。 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端

3、运维

3-1 MySQL的数据类型

  • 数值类型

INTEGER、SMALLINT、DECIMAL、 NUMERIC、FLOAT、REAL、 DOUBLE PRECISION、TINYINT(删除标记推荐)、MEDIUMINT 和 BIGINT

  • 日期类型

DATETIME(8 bytes,YYYY-MM-DD HH:MM:SS)、DATE(3 bytes,YYYY-MM-DD)、TIMESTAMP、TIME(3 bytes,HH:MM:SS)和YEAR

  • 字符串类型

CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT

3-2 MySQL的约束

6 大约束:主键约束(PRIMARY KEY)、外键约束(FOREIGN KEY)、唯一约束(UNIQUE)、检查约束(CHECK)、非空约束(NOT NULL)、默认值约束(DEFAULT)

3-3 索引的设计

1、选择唯一性索引
2、常排序,联合,联合的字段建立索引
3、常查询字段建立索引
4、限制索引的数目
5、尽量使用数据量少的索引
6、数据量少的表尽量不使用索引
7、尽量使用前缀来索引
8、删除不经常使用,冗余的索引

3-4 简述存储过程及其优点

1、提高程序的性能,编译之后,缓存存储在数据库中,方便下次访问,提高数据再次访问的速度
2、存储过程有助于减少 App到数据库服务器之间的流量(应用程序不必发送多个冗长的SQL语句,而只能发送存储过程的名称和参数)
3、存储的程序对于任何 App都是可重用和透明的,将数据库的接口暴露给App
4、安全的,DBA可以向访问存储过程的 App授予适当的权限,而不向表授予权限

3-5 MySQL如何实现定时任务

MySQL 5.1.6开始增加了事件调度器,用于定时执行某些特定的任务

  • 使用“事件”功能之前必须确保event_scheduler已开启
    1、查询功能是否开启
-- 方法一
SELECT @@event_scheduler;
-- 方法二
SHOW VARIABLES LIKE 'event%';

2、事件的开启和关闭

-- 开启功能命令:
SET GLOBAL event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
-- 关闭功能命令:
SET GLOBAL event_scheduler = 0;
SET GLOBAL event_scheduler = OFF;

数据库重启后会自动关闭;
持久化开启:将event_scheduler=1写到my.cnf配置文件中,并保存

3、event创建语句

CREATE EVENT [IFNOT EXISTS] event_name
       ON SCHEDULE schedule(调度时间设置)
       [ON COMPLETION [NOT] PRESERVE]
       [ENABLE | DISABLE | DISABLE ON SLAVE]
       [COMMENT 'comment']
       DO sql_statement;

创建单次定时执行事件

CREATE EVENT event
ON SCHEDULE AT TIMESTAMP '2022-5-26 12:00:00' 
DO INSERT INTO `student` (`id`, `name`, `createTime`) VALUES (1, 'a', NOW())

循环定时执行事件

# 从当前开始,每5秒往student表中插入一行数据
CREATE EVENT event1
ON SCHEDULE EVERY 5 SECOND 
ON COMPLETION PRESERVE 
DO INSERT INTO `student` (`id`, `name`, `createTime`) VALUES (2, 'b', NOW())

4、删除事件

DROP EVENT [IF EXISTS] event_name

5、修改事件

ALTER EVENT event_name
       [ONSCHEDULE schedule]
       [old_NAME TO new_NAME]
       [ON COMPLETION [NOT] PRESERVE]
       [COMMENT 'comment']
       [ENABLE 开启事件任务| DISABLE 关闭事件任务]
       [DO sql_statement]

4、体系架构

4-1 简述MySQL体系架构


MySQL体系架构1

MySQL体系架构2

三层:应用层、MySQL服务层、存储引擎层

4-2 MySQL的参数文件位置以及如何配置

  • Linux环境
    MySQL的配置文件是my.cnf
# 一般情况下存在位置
/etc/my.cnf
/etc/mysql/my.cnf
# 找不到的话进行搜索
find / -name my.conf

读取配置文件的顺序,以最后读到的为准

/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
../.my.cnf
  • Windows环境
    查看MySQL的安装目录和数据存放目录
mysql> select @@basedir;
+------------------------------------------+
| @@basedir                                |
+------------------------------------------+
| C:\Program Files\MySQL\MySQL Server 8.0\ |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> select @@datadir;
+---------------------------------------------+
| @@datadir                                   |
+---------------------------------------------+
| C:\ProgramData\MySQL\MySQL Server 8.0\Data\ |
+---------------------------------------------+
1 row in set (0.00 sec)

my.ini 配置文件

mysql in性能问题用or替代_mysql_03

路径:
C:\ProgramData\MySQL\MySQL Server 8.0
# 记事本打开 my.ini,可以看到配置的端口号,以及MySQL的安装目录和数据存放目录...
[client]

# pipe=

# socket=MYSQL

port=3306
# 可以看到,MySQL的默认引擎是 INNODB
# The default storage engine that will be used when create new tables when
default-storage-engine=INNODB
[client]
[mysqld_safe]
[mysqld]
Query Cache MySQL 错误日志设置 慢查询记录 全局查询日志
从属线程变量
安全变量
MyISAM 变量
MEMORY 变量
InnoDB 变量 WSREP 配置

4-3 MySQL 参数持久化文件

MySQL 8 新特性:全局参数持久化!

  1. MySQL版本
mysql> select -version();
+------------+
| -version() |
+------------+
|         -8 |
+------------+
1 row in set, 1 warning (0.01 sec)
  1. 全局参数持久化

SET PERSIST 来设定任意可动态修改的全局变量!(可以修改内存中变量的值)
SET PERSIST_ONLY(不会修改内存中变量的值)

mysql> select * from performance_schema.persisted_variables;
Empty set (0.14 sec)

mysql> show variables like '%max_connections%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| max_connections        | 151   |
| mysqlx_max_connections | 100   |
+------------------------+-------+
2 rows in set, 1 warning (0.03 sec)

4-4 socket是什么,如何使用 socket登录

socket是一种操作系统提供的进程间通信机制

socket流程

mysql in性能问题用or替代_mysql_04

socket实现登录

1、使用Socket编程实现服务端注册:
注册信息保存在properties文件中
封装格式:id={id:1002,name:tom,pwd:123,age:20}
注册成功后返回字符串”注册成功“
2、使用Socket编程实现服务器端登录:
获取properties文件中的用户信息,进行用户id与密码的校验
校验成功后返回字符串”登录成功“

4-5 MySQL表结构定义文件

因为 MySQL插件式存储引擎结构的结构体系关系,MySQL对数据的存储按照表进行存储的,每个表都会有与之对应的文件,无论存储引擎是什么,都会生成一个.frm的定义表结构的文件,它还用来存储视图的定义

4-6 错误日志如何配置

MySQL的错误日志(Error Log)主要记录 MySQL 服务器启动和停止过程中的信息、服务器在运行过程中发生的故障和异常情况

  • 1、启动和设置错误日志
    MySQL数据库默认开启错误日志,存储在MySQL的数据文件夹下,通常名称为 hostname.err
  • 2、查看错误日志
    错误日志以文本文件的形式存储
SHOW VARIABLES LIKE 'log_error';

3、删除错误日志文件

mysqladmin -uroot -p flush-logs

4-7 慢查询日志是什么,如何配置

慢查询日志是:排查问题 SQL 语句,以及检查当前 MySQL 性能
默认slow_query_log的值为OFF,表禁用

# 查看
show variables  like '%slow_query_log%';
# 打开
set global slow_query_log=1;

重启之后可能会失效,需要永久修改的话,需要对my.ini配置文件进行修改

日志分析工具mysqldumpslow

4-8 Redo log和 Binlog区别

  • redo log(重做日志文件)
    用于记录事务操作的变化,记录数据修改之后的值,无论事务是否提交都会记录下来。比如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,从而保证数据的完整性
    每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组至少有2个重做日志文件,如默认的ib_logfile0和ib_logfile1

影响 redo log四大参数 nnodb_log_file_size、innodb_log_files_in_group、innodb_log_group_home_dir、innodb_mirrored_log_groups

mysql> show variables like 'innodb%log%';
+------------------------------------+------------+
| Variable_name                      | Value      |
+------------------------------------+------------+
| innodb_api_enable_binlog           | OFF        |
| innodb_flush_log_at_timeout        | 1          |
| innodb_flush_log_at_trx_commit     | 1          |
| innodb_log_buffer_size             | 1048576    |
| innodb_log_checksums               | ON         |
| innodb_log_compressed_pages        | ON         |
| innodb_log_file_size               | 50331648   |  默认值48MB
| innodb_log_files_in_group          | 2          |  默认的两个组
| innodb_log_group_home_dir          | .\         |
| innodb_log_spin_cpu_abs_lwm        | 80         |
| innodb_log_spin_cpu_pct_hwm        | 50         |
| innodb_log_wait_for_flush_spin_hwm | 400        |
| innodb_log_write_ahead_size        | 8192       |
| innodb_log_writer_threads          | ON         |
| innodb_max_undo_log_size           | 1073741824 |
| innodb_online_alter_log_max_size   | 134217728  |
| innodb_print_ddl_logs              | OFF        |
| innodb_redo_log_archive_dirs       |            |
| innodb_redo_log_encrypt            | OFF        |
| innodb_undo_log_encrypt            | OFF        |
| innodb_undo_log_truncate           | ON         |
+------------------------------------+------------+
21 rows in set, 1 warning (0.07 sec)
  • binlog
    记录了对MySQL数据库执行更改的所有操作,不包括SELECT和SHOW这类操作,若操作本身并没有导致数据库发生变化,那么该操作也会写入二进制日志。
    如果想记录SELECT和SHOW操作,那只能使用查询日志–general_log=[0|1]

影响binlog的参数 max_binlog_size、binlog_cache_size

5、备份数据库恢复

5-1 MySQL备份方式

物理备份:通过系统自带命令进行复制cp或tar打包压缩的方式备份,也叫冷备份;
逻辑备份:通过mysql自带服务或者额外安装软件进行备份;mysqldump 和 mysql
冷热备份:在备份的过程中别人无法访问的叫冷备份,备份过程中也能访问的叫热备份;

5-2 PXB备份(Percona XtraBackup)

PXB:是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQL、Oracle

XtraBackup完成主数据库不停机、不锁表进行热备份,并完成MySQL主从复制的在线配置。
局限:只能备份InnoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。

PXB备份详解

5-3 MySQL表级的误操作之后,有哪些工具恢复数据

  • 传统:binlog闪回误操作数据,增量binlog备份
  • 先进:binlog2sql快速闪回

1、确认你的MySQL开启了binlog,并且设置如下参数
[mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_size = 100M binlog-format = row 2、安装开源工具binlog2sql,目的:生成回滚SQL
shell> git clone https://github.com/danfengcao/binlog2sql.git shell> pip install -r requirements.txt

其他回滚工具:mysqlbinlog增加的flashback,延时备份

5-4 MySQL常用备份工具

1、Mysqldump是mysql自带的备份工具,目录在bin目录下面:/usr/local/mysql/bin/mysqldump,支持基于innodb的热备份。适用于数量级别小的备份

2、系统自带的cp/tar工具:这是一种物理备份,这种备份的原理是基于快照实现的,快照(请求一个全局锁),之后立即释放锁,达到几乎热备的效果。需要注意的是不能仅仅只备份数据,要同时备份事务日志,并且要求数据和日志在同一逻辑卷。

3、xtrabackup:由Percona开发的很强大的开源工具,支持对InnoDB做热备,物理备份工具。

5-5 MySQL备份计划如何确定

  1. 数据库是不是都是innoDB引擎表 ===>决定备份方式,热备或冷备
  2. 数据量大小 ===>逻辑备(量小)或物理备,全量或增量
  3. 数据库本地空间是否充足===>备份到本地或远程
  4. 需要多快恢复 ===>备份频率 小时或天

5-6 数据表损坏的修复方法

1、使用mysql的check table和repair table 的sql语句

check table tabTest;
如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
repair table tabTest;
进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。

2、使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具

myisamchk适用于MYISAM类型的数据表,而isamchk适用于ISAM类型的数据表。
当发现某个数据表出现问题时 myisamchk tablename.MYI
进行检测,如果需要修复的话,可以使用:
myisamchk -of tablename.MYI
注意:
在进行修改时必须确保MySQL服务器没有访问这个数据表,
保险的情况下是最好在进行检测时把MySQL服务器Shutdown掉。

6、高可用

6-1 主从复制作用及其解决的问题

MySQL的主从复制中主要有三个线程:master(binlog dump thread)、slave(I/O thread 、SQL
thread),Master一条线程和Slave中的两条线程

mysql in性能问题用or替代_MySQL_05

master 线程在负责Master库中有数据更新的时候,会按照binlog格式,将更新的事件类型写入到主库的binlog文件中。Master会创建log dump线程通知Slave主库中存在数据更新。I/O 线程请求Master,Master会返回binlog的名称以及当前数据更新的位置、binlog文件位置的副本。binlog保存在中继日志中,中继日志也是记录数据更新的信息。
SQL线程也是在Slave中创建的,当Slave检测到中继日志有更新,就会将更新的内容同步到Slave数据库中,这样就保证了主从的数据的同步。

主从复制采取不同的策略方式进行数据的同步 同步策略:Master会等待所有的Slave都回应后才会提交,这个主从的同步的性能会严重的影响。
半同步策略:Master至少会等待一个Slave回应后提交。
异步策略:Master不用等待Slave回应就可以提交。
延迟策略:Slave要落后于Master指定的时间。

6-2 读写分离有哪些方案

1、mysql-connector-java的jdbc驱动

// 在jdbc的url中配置为如下的形示:
jdbc:mysql:replication://master,slave1,slave2,slave3/test

2、sharding-jdbc的方式

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.1</version>
</dependency>

3、应用内路由的方式

在应用程序中实现,针对不同的请求(方法名称)类型去不同的实例执行sql

4、MySQL proxy代理的方式

在应用和数据库之间增加代理层,代理层接收应用对数据库的请求,根据不同请求类型转发到不同的实例,在实现读写分离的同时可以实现负载均衡。(不推荐使用)

6-3 GTID

GTID的概述:

1、全局事物标识:global transaction identifieds。
2、GTID事物是全局唯一性的,且一个事务对应一个GTID。
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。
5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
6、在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

1、slave在接受master的binlog时,会校验master的GTID是否已经执行过(一个服务器只能执行一次)。

2、为了保证主从数据的一致性,多线程只能同时执行一个GTID。

6-3 MySQL常用中间件

中间件

6-4 分库分表和表分区的区别

分表:将一张表拆分为多张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件

分区:将一张表分到不同的区块,区块可以在不同的磁盘下,还是一张表,不过存储它的区块变多了

mysql in性能问题用or替代_MySQL_06

  • 分库分表

如果你的单机性能很低了,那可以尝试分库。分库,业务透明,在物理实现上分成多个服务器,不同的分库在不同服务器上。分区可以把表分到不同的硬盘上,但不能分配到不同服务器上。一台机器的性能是有限制的,用分库可以解决单台服务器性能不够,或者成本过高问题。
当分区之后,表还是很大,处理不过来,这时候可以用分库。
分类:垂直切分和水平切分

7、性能优化

7-1 主键采用自增 ID 还是 UUID

建议mysql不要用uuid,用自增主键,自增主键效率高
innodb的索引特性导致了自增id做主键是效率最好

自增ID主键+步长,适合中等规模的分布式场景
UUID,适合小规模的分布式环境
雪花算法自造全局自增ID,适合大数据环境的分布式场景

8、故障处理

8-1 root 密码忘记

Windows

Linux

8-2 Binlog 满

mysqlbinlog 文件的生成顺序是递增的,也就是mysql-binlog.000100 比起mysql-binlog.000101,
mysql-binlog.000100是较为早一些的binlog日志。 rm 删除的时候,一定不能删除正在使用的binlog文件。另外用rm
删除的binlog ,一定要再purge一次,不然数据库无法启动。

rm  mysql-binlog.000100
purge binary logs to 'mysql-bin.0000100'

8-3 MySQL无法创建函数

1、安全参数没有开启,log_bin_trust_function_creators 默认为0,是不允许function的同步的,开启这个参数,就可以创建成功了

-- 查看是否开启创建函数的功能
show variables like '%func%';
-- 开启创建函数的功能
set global log_bin_trust_function_creators = 1;