1. 通过客户端/服务器通信协议与 MySQL 建立连接 2. 查询缓存,这是 MySQL 的一个可优化查询的地方,如果开启了 Query Cache 且在查询缓存过程中查询到完全相同的 SQL 语句,则将查询结果直接返回给客户端;如果没有开启Query Cache 或者没有查询到 完全相同的 SQL 语句则会由解析器进行语法语义解析,并生成解析树。 3. 预处理器生成新的解析树。 4. 查询优化器生成执行计划。 5. 查询执行引擎执行 SQL 语句,此时查询执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API 接口与底层存储引擎缓存或者物理文件的交互情况,得到查询结果,由MySQL Server 过滤后将查询结 果缓存并返回给客户端。若开启了 Query Cache,这时也会将SQL 语句和结果完整地保存到 QueryCache 中,以后若有相同的 SQL 语句执行则直接返回结果。
-- 查看错误日志文件路径 show variables like ‘log_error‘; +---------------+---------------------+ | Variable_name | Value | +---------------+---------------------+ | log_error | /var/log/mysqld.log | +---------------+---------------------+ -- 慢查询日志文件路径 show variables like ‘slow_query_log_file‘; +---------------------+-----------------------------------+ | Variable_name | Value | +---------------------+-----------------------------------+ | slow_query_log_file | /var/lib/mysql/localhost-slow.log | +---------------------+-----------------------------------+ -- bin log 日志文件 需要在 my.cnf 中配置 log-bin=/var/log/mysql-bin/bin.log server-id=2 -- 查看 relay log 相关参数 show variables like ‘%relay%‘;
[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/mysqldata/3307/mysql.pid #pid文件所在目录 basedir = /usr/local/mysql-5.7.11 #使用该目录作为根目录(安装目录) datadir = /data/mysqldata/3307/data #数据文件存放的目录 tmpdir = /data/mysqldata/3307/tmp #MySQL存放临时文件的目录 character_set_server = utf8mb4 #服务端默认编码(数据库级别)
-- 查看数据文件的位置 show variables like ‘%dir%‘; +-----------------------------------------+----------------------------+ | Variable_name | Value | +-----------------------------------------+----------------------------+ | datadir | /var/lib/mysql/ | +-----------------------------------------+----------------------------+ 1、.frm文件 不论是什么存储引擎,每一个表都会有一个以表名命名的.frm文件,与表相关的元数据(meta)信息都存放在此文件中,包括表结构的定义信息等。 2、.MYD文件 myisam存储引擎专用,存放myisam表的数据(data)。每一个myisam表都会有一个.MYD文件与之呼应,同样存放在所属数据库的目录下 3、.MYI文件 也是myisam存储引擎专用,存放myisam表的索引相关信息。每一个myisam表对应一个.MYI文件,其存放的位置和.frm及.MYD一样 4、.ibd文件 存放innoDB的数据文件(包括索引)。 5. db.opt文件 此文件在每一个自建的库里都会有,记录这个库的默认使用的字符集和校验规则
完整备份 | 差异备份 | 增量备份 | ||
备 份 方 法 | 备份所有文件 | 一次全备份后,备份与全 备份差异的部分 |
一次全备份后,备份与上次备 份的差异部分 |
|
备 份 速 度 | 最慢 | 较快 | 最快 | |
恢 复 速 度 | 最快 | 较快 | 最慢 | |
空 间 要 求 | 最多 | 较多 | 最少 | |
优 势 | 最快的恢复速度, 只需要上 一次完全备份就能恢复 |
相比增量,更快也更简单 并且只需要最近一次的 完全备份 和最后一次的差异备份 就能恢复 |
备份速度快,较少的空间需求,没有重复的备份文件 | |
劣 势 | 最多的空间需求 大量重复的备份 |
较慢的备份速度,仍然会 存在许多的备份文件 |
最慢的恢复速度,恢复需要最近一次完全备份和全部增量备份 |
1. 关闭SELinux,修改 selinux 配置文件,将SELINUX=enforcing改为SELINUX=disabled,保存后退出 vim /etc/selinux/config SELINUX=disabled 2. 重启 reboot # 重启命令 3. 找到MySQL数据文件位置,停止MySQL服务 SHOW VARIABLES LIKE ‘%dir%‘; -- 结果显示, 数据目录就是datadir的所在位置,即 /var/lib/mysql/ service mysqld stop -- 停止mysql 4.进入到 /mysql 目录, 执行打包命令 将数据文件打包备份 cd /var/lib/ # 进入其上级目录 tar jcvf /root/backup.tar.bz2 mysql/ # 打包压缩到 root目录下 5. 删除掉数据目录下的所有数据 -- 删除原目录 rm -rf /var/lib/mysql/ 6. 恢复数据 (使用tar命令) -- 解压 tar jxvf backup.tar.bz2 mysql/ -- 把备份的文件移动到/var/lib/里面去替代原来的mysql mv /root/mysql/ /var/lib/ 7. 启动MySQL, 然后登陆MySQL,查看数据是否丢失, 如果数据正常代表冷备成功 service mysqld start
## 备份单个数据库 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. 备份数据表 [root@localhost databackup]# 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
1. FORM子句 : 左右两个表的笛卡尔积 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:取出指定行的记录, 并将结果返回。
SHOW VARIABLES LIKE "%query%"; ## slow_query_log:是否开启慢查询日志, 1 表示开启, 0 表示关闭。 ## slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径 ## long_query_time: 慢查询阈值,当查询时间多于设定的阈值时,记录日志 SHOW VARIABLES LIKE "%output%"; ## log_output 日志文件放到文件里还是表里
SHOW VARIABLES LIKE "%query%";
set global slow_query_log=1;
-- 编辑配置 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%‘; +---------------------+-------------------------------+ | Variable_name | Value | +---------------------+-------------------------------+ | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/lagou-slow.log | +---------------------+-------------------------------+
mysql> SHOW VARIABLES LIKE ‘%log_output%‘; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+ MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=‘FILE,TABLE‘。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件.
mysql> show variables like ‘log_queries_not_using_indexes‘; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | OFF | +-------------------------------+-------+ mysql> set global log_queries_not_using_indexes=1; Query OK, 0 rows affected (0.00 sec) mysql> show variables like ‘log_queries_not_using_indexes‘; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | ON | +-------------------------------+-------+ 1 row in set (0.00 sec)
特性 | InnoDB | MyISAM | MEMORY |
存储限制 | 64TB | 无 | 有 |
支持事务 | 支持 | 不支持 | 不支持 |
锁机制 | 行锁 | 表锁 | 表锁 |
B-tree索引 | 支持 | 支持 | 支持 |
哈希索引 | 支持 | 不支持 | 支持 |
外键支持 | 支持 | 不支持 | 不支持 |
存储空间消耗 | 高 | 低 | 低 |
内存消耗 | 高 | 低 | 高 |
批量写入数据消耗 | 慢 | 快 | 快 |
CREATE TABLE tablename ( [...], PRIMARY KEY (字段名) );
ALTER TABLE tablename ADD PRIMARY KEY (字段名);
CREATE INDEX <索引的名字> ON tablename (字段名);
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名);
CREATE TABLE tablename ( [...], INDEX [索引的名字] (字段名) );
CREATE UNIQUE INDEX <索引的名字> ON tablename (字段名);
ALTER TABLE tablename ADD UNIQUE INDEX [索引的名字] (字段名);
CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (字段名) ;
-- 复合索引可以代替多个单一索引,相比多个单一索引复合索引所需的开销更小。 CREATE INDEX <索引的名字> ON tablename (字段名1,字段名2...); ALTER TABLE tablename ADD INDEX [索引的名字] (字段名1,字段名2...); CREATE TABLE tablename ( [...], INDEX [索引的名字] (字段名1,字段名2...) );
--使用全文索引,查询速度会比like快很多倍。 -- 在MySQL 5.6 以前的版本,只有MyISAM存储引擎支持全文索引 -- 从MySQL 5.6开始MyISAM和InnoDB存储引擎均支持 CREATE FULLTEXT INDEX <索引的名字> ON tablename (字段名); ALTER TABLE tablename ADD FULLTEXT [索引的名字] (字段名); CREATE TABLE tablename ( [...], FULLTEXT KEY [索引的名字] (字段名) ;
SELECT * FROM users3 WHERE MATCH(NAME) AGAINST(‘aabb‘); -- * 表示通配符,只能在词的后面 SELECT * FROM users3 WHERE MATCH(NAME) AGAINST(‘aa*‘ IN BOOLEAN MODE);
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互
原文:https://www.cnblogs.com/forever-fate/p/15312396.html