前言
虽然不是DBA,但是了解mysql的一些基本知识对于我们提高自身水平和提高书写sql语句性能有帮助!
内容
1.配置文件:
文件名称 | 作用 |
---|---|
二进制日志log-bin | 用于主从复制 |
错误日志log-error | 默认是关闭的,记录严重的警告和错误信息,每次启动和关闭的详细信息等 |
查询日志log | 默认是关闭的,记录查询的sql语句,如果开启会降低mysql的整体性能,因为记录也是需要消耗系统资源的 |
数据文件 | frm文件:存放表结构;myd文件:存放表结构;myi文件:存放表索引 |
这些文件的配置根据系统的不同配置方式是一样,只不过文件名称不一样,windows的名称为my.ini文件,而linux系统下的在/etc/my.conf文件:配置方式都是【mysqld】下,举例配置:
2.架构;
@.架构示意图
简单分层介绍
分层名称 | 作用 |
---|---|
连接层 | 客户端和连接服务,包含本地socket通信和大多数基于客户端/服务器端工具实现的tcp/ip的通信 |
服务层 | 第二层架构主要完成核心服务功能,如sql接口,完成缓存查询,sql的分析和优化以及内部的部分内置函数的执行。所有的跨引擎的功能在这一层实现 |
引擎层 | 存储引擎层,负责mysql的数据的存储和提取,服务器通过api与存储引擎进行通信。主要常见:MyISAM和InnoDB |
文件 | 数据存储层,数据存储运行与文件系统之上,完成与存储引擎的交互 |
优势:与其他数据库相比,mysql与众不同,它的架构可以在多种不同场景中应用并且发挥良好作用。主要体现在存储引擎的架构上。插件式存储引擎架构将查询出来和其他的系统任何以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需求选择合适的存储引擎。
3.存储引擎
查看本机引擎有两种方式:
show variables like '%storge_engine%';
show engines
查看某张表的存储引擎方式:use db01;
show create table user;
mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| user | CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
show table status from db01 where name='user'
mysql> show table status from db01 where name='user' \G
*************************** 1. row ***************************
Name: user
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 2
Avg_row_length: 8192
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2018-07-10 01:04:41
Update_time: 2018-07-10 01:05:58
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
查看某引擎的存在那几张表中:
select table_catalog ,table_schema,table_name ,engine from information_schema.tables where table_schema='db01' and engine='InnoDB';
mysql> select table_catalog ,table_schema,table_name ,engine from information_schema.tables where table_schema='db01' and engine='InnoDB';
+---------------+--------------+------------+--------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | ENGINE |
+---------------+--------------+------------+--------+
| def | db01 | user | InnoDB |
+---------------+--------------+------------+--------+
1 row in set (0.01 sec)
修改某张表的引擎方式
- 真接修改
ALTER TABLE my_table ENGINE=InnoDB
在数据多的时候比较慢,而且在修改时会影响读取性能。my_table是操作的表,innoDB是新的存储引擎。 - 导出,导入。这个比较容易操作,直接把导出来的sql文件给改了,然后再导回去。用mysqldump ,常用的是navicate那样更容易上手。友情提醒风险较大。
创建,插入。这个比第一种速度快, 安全性比第二种高,推荐。分2步操作
a.创建表,先创建一个和要操作表一样的表,然后更改存储引擎为目标引擎。`INSERT INTO my_tmp_table; SELECT * FROM my_table;
`b.插入。为了安全和速度,最好加上事务,并限制id(主键)范围。
INSERT INTO my_tmp_table SELECT * FROM my_table;
常见的两种引擎之间的区别:
4.sql_model介绍
sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题 ;
查看sql_mode的设置:
//第一种方式
vi /etc/my.cnf
//第二种方式,登录mysql之后
SELECT @@GLOBAL.sql_mode;
+--------------------------------------------+
| @@global.sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql5.0以上版本支持三种sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES。
ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。
STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。
查看sql_mode的详解
总结
感谢浏览!希望对你有帮助!