MySQL的日志类型
日志用于记录数据库的运行情况,以及用户对数据库执行的各类操作。当数据库发生故障时,可以根据日志分析和解决问题,从而对数据库进行恢复。
日志 描述
重做日志(redo log)
重做日志是一种物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。
回滚日志(undo log)
回滚日志是一种逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。
二进制日志(binlog)
二进制日志是一种逻辑格式的日志,以二进制文件的形式记录了数据库中的操作,但不记录查询语句。
错误日志(errorlog)
错误日志记录着mysqld启动和停止,以及服务器在运行过程中发生的错误的相关信息。
慢查询日志(slow query log) 慢查询日志记录执行时间过长和没有使用索引的查询语句。
一般查询日志(general log)
记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log都会将其记录下来。
中继日志(relay log) 中继日志类似二进制;可用于复制架构中,使从服务器和主服务器的数据保持一致
慢查询日志
慢查询日志用于记录MySQL数据库中响应时间超过指定阈值的语句。慢查询日志通常也被称之为慢日志,因为它不仅仅只针对SELECT语句,像INSERT、UPDATE、DELETE等语句,只要响应时间超过所设定阈值都会记录在慢查询日志中。
参数 描述
slow_query_log
是否开启慢查询日志,1表示开启,0表示关闭。
slow_query_log_file
慢查询日志存储路径,可选。
注意:MySQL 5.6之前的版本,参数名为 log-slow-queries
long_query_time
阈值,当SQL语句的响应时间超过该阈值就会被记录到日志中。
l
og_queries_not_using_indexes
未使用索引的查询也被记录到慢查询日志中,可选。
log_output
日志存储方式,默认为FILE。
log_output=‘FILE
’表示将日志存入文件
log_output=‘TABLE’
表示将日志存入数据库
log_output=‘FILE,TABLE’
表示同时将日志存入文件和数据库
开启慢查询日志
#查看是否开启慢查询日志
show variables like ‘slow%’;
#临时开启慢查询日志
set slow_query_log=‘ON’;
set long_query_time=1; #慢查询日志文件所在位置
show variables like ‘%datadir%’;
MySQL存储引擎
存储引擎,就是如何存储数据、如何更新数据、如何查询数据、如何为存储的数据建立索引等一系列技术的实现方法。
#查看mysql支持的存储引擎
show engines;
**存储引擎 **
MyISAM 拥有较快的插入、查询速度,但不支持事务
InnoDB 支持ACID事务,支持行级锁,支持外键;MySQL 5.5版本后的默认存储引擎
MRG_MYISAM 将一组结构相同的MyISAM表聚合成一个整体,再进行增删改查操作
Memory 所有数据存储在内存中,响应快;MySQL重启时数据会全部丢失
Archive 归档,且有压缩机制,适用于历史数据归档
CSV 逻辑上由逗号分隔数据,会为每张表创建一个.csv文件
DDL之数据表
在DDL中,对数据表的操作主要有3种:创建、修改和删除。
创建数据表,需要定义的信息主要包括:表名、字段名、字段类型。
#MySQL的建表语法
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name [(create_definition,…)] [table_options]
[select_statement]
说明:
TEMPORARY:表示创建临时表,在当前会话结束后将自动消失
IF NOT EXISTS:在建表前,先判断表是否存在,只有该表不存在时才创建
create_definition:建表语句的关键部分,用于定义表中各列的属性
table_options:表的配置选项,例如:表的默认存储引擎、字符集
select_statement:通过select语句建表 建
对于已经存在的表,可以使用alter命令添加、修改、删除字段,也可以对表进行删除操作。
#添加字段sex,类型为VARCHAR(1)
ALTER TABLE contacts ADD sex VARCHAR(1);
#修改字段sex的类型为tinyint
ALTER TABLE contacts MODIFY sex tinyint; #删除字段sex
ALTER TABLE contacts DROP COLUMN sex;
#删除contacts表
DROP TABLE contacts;
数据库与表的基本操作
插入数据
在MySQL中,使用insert into语句向数据表中插入数据。
INSERT 插入单条数据:
INSERT INTO table_name (field1, field2, …, fieldN) VALUES (value1, value2, …, valueN);
INSERT 插入多条数据:
INSERT INTO table_name (field1, field2, …, fieldN) VALUES (valueA1, valueA2, …, valueAN), (valueB1,
valueB2, …, valueBN), …, (valueN1, valueN2, …, valueNN);
注意事项:
1、如果字段是字符型,值必须使用单引号或者双引号,如”value”;如果值本身带单引号或双引号,需要转义
2、如果所有列都要添加数据,insert into语句可以不指定列,即
INSERT INTO table_name VALUES (value1, value2, …, valueN);
修改数据
在MySQL中,使用update语句来修改数据表中的数据。
update语法:
UPDATE table_name SET field1=newValue1, field2=newValue2 [WHERE Clause]
注意事项:
1、可以同时更新一个或多个字段
2、可以通过where子句来指定更新的范围,如果不带where,则更新数据表中的所有记录
删除数据
在MySQL中,使用delete语句来删除数据表中的数据。
delete语法:
DELETE FROM table_name [WHERE Clause]
注意事项:
1、可以通过where子句来指定删除的范围,如果不带where,则删除数据表中的所有记录
数据完整性
数据完整性是指存储在数据库中的数据,应该保持一致性和可靠性。
关系模型允许定义三类数据约束,它们是实体完整性、参照完整性以及用户定义的完整性约束,其
中前两种完整性约束由关系数据库系统自动支持。
实体完整性
实体完整性要求每张表都有唯一标识符,每张表中的主键字段不能为空且不能重复。
域完整性
域完整性是针对某一具体关系数据库的约束条件,它保证表中某些列不能输入无效的值。
域完整性指列的值域的完整性,如数据类型、格式、值域范围、是否允许空值等。
参照完整性
参照完整性要求关系中不允许引用不存在的实体。
用户自定义完整性
用户自定义完整性是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。
唯一性约束
在MySQL中,可以使用关键字 UNIQUE 实现字段的唯一性约束,从而保证实体的完整性。
UNIQUE 意味着任何两条数据的同一个字段不能有相同值。
一个表中可以有多个 UNIQUE 约束
外键约束
外键(FOREIGN KEY)约束定义了表之间的一致性关系,用于强制参照完整性。
外键约束定义了对同一个表或其他表的列的引用,这些列具有PRIMARY KEY或UNIQUE约束。
mysql查询语句
where子句(单条件查询)
在SQL中,insert、update、delete和select后面都能带where子句,用于插入、修改、删除或查
询指定条件的记录。
#SQL语句中使用where子句语法
SELECT column_name FROM table_name WHERE column_name 运算符 value
运算符 描述
= 等于
<> 或 != 不等于
大于
< 小于
= 大于等于
<= 小于等于
between and 选取介于两个值之间的数据范围;在MySQL中,相当于>=并且<=
where子句(多条件查询)
在where子句中,使用and、or可以把两个或多个过滤条件结合起来。
#and、or运算符语法
SELECT column_name FROM table_name WHERE condition1 AND condition2 OR condition3
运算符 描述
and 表示左右两边的条件同时成立
or 表示左右两边只要有一个条件成立
运算符in的使用
运算符 IN 允许我们在 WHERE 子句中过滤某个字段的多个值。
#where子句使用in语法
SELECT column_name FROM table_name WHERE column_name IN(value1, value2, …)
运算符like的使用
在where子句中,有时候我们需要查询包含xxx 字符串的所有记录,这时就需要用到运算符like。
#where子句使用like语法
SELECT column_name FROM table_name WHERE column_name LIKE ‘%value%’
说明:
1、LIKE子句中的%类似于正则表达式中的*,匹配任意0个或多个字符
2、LIKE子句中的_匹配任意单个字符
3、LIKE子句中如果没有%和_,就相当于运算符=的效果
order by的使用
在SQL中,使用order by对查询结果集进行排序,可以按照一列或多列进行排序。
#order by语法
SELECT column_name1, column_name2
FROM table_name1, table_name2
ORDER BY column_name, column_name [ASC|DESC]
说明:
- ASC表示按升序排列,DESC表示按降序排列。
- 默认情况下,对列按升序排列。
limit的使用
在SELECT语句中使用LIMIT子句来约束要返回的记录数,通常使用LIMIT实现分页。
#limit语法
SELECT column_name1, column_name2
FROM table_name1, table_name2
LIMIT [offset,] row_count
说明:
3. offset指定要返回的第一行的偏移量。第一行的偏移量是0,而不是1。
4. row_count指定要返回的最大行数。 【经验分享】limit的分页公式:
limit (page-1)*row_count, row_count
group by的使用
从字面上理解,group by表示根据某种规则对数据进行分组,它必须配合聚合函数进行使用,对数
据进行分组后可以进行count、sum、avg、max和min等运算。
#group by语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
说明:
5. aggregate_function表示聚合函数。
6. group by可以对一列或多列进行分组。
having的使用
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。HAVING 子句可
以对分组后的各组数据进行筛选。
#having语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
表连接
表连接(JOIN)是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获 取数据。#表连接语法
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
各种表连接的区别
explain简介
explain命令可以查看SQL语句的执行计划。当explain与SQL语句一起使用时,MySQL将显示来自
优化器的有关语句执行计划的信息。也就是说,MySQL解释了它将如何处理语句,包括有关如何联
接表以及以何种顺序联接表的信息。
explain能
1.分析出表的读取顺序
2. 数据读取操作的操作类型
3. 哪些索引可以使用
4. 哪些索引被实际使用
5. 表之间的引用
6. 每张表有多少行被优化器查询
explain的使用很简单,只需要在SQL语句之前加上explain命令即可,除select语句外,explain也
能分析insert、update和delete语句。
explain结果解析
参数 描述
id 执行select子句或操作表的顺序
select_type 查询的类型,如SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION等
table 当前行使用的表名
partitions 匹配的分区
type 连接类型,如system、const、eq_ref、ref、range、index、all等
possible_keys 可能使用的索引
key 实际使用的索引,NULL表示未使用索引
key_len 查询中使用的索引长度
ref 列与索引的比较
rows 扫描的行数
filtered 选取的行数占扫描的行数的百分比,理想的结果是100
extra 其他额外信息
MySQL内置函数
我们通常说的MySQL函数指的是MySQL数据库提供的内置函数,包括数学函数、字符串函数、日
期和时间函数、聚合函数、条件判断函数等,这些内置函数可以帮助用户更方便地处理表中的数据,
简化用户的操作。
函数 描述
数学函数 如ABS、SQRT、MOD、SIN、COS、TAN、COT等
字符串函数 如LENGTH、LOWER、UPPER、TRIM、SUBSTRING等
日期和时间函数 如NOW、CURDATE、CURTIME、SYSDATE、DATE_FORMAT、YEAR、MONTH、WEEK等
聚合函数 COUNT、SUM、AVG、MIN、MAX
条件判断函数 IF、IFNULL、CASE WHEN等
系统信息函数 VERSION、DATABASE、USER等
加密函数 MD5、SHA1、SHA2等
函数now()
函数now()用于返回当前的日期和时间。
应用场景:
在实际应用中,大多数业务表都会带一个创建时间create_time字段,用于记录每一条数据的产生时间。在向表
中插入数据时,就可以在insert语句中使用now()函数。
示例如下:
insert into user(id, name, create_time) values(1, ‘zhangsan’, now());
函数date_format()
函数date_format()用于以指定的格式显示日期/时间。
应用场景:
在实际应用中,一般会按照标准格式存储日期/时间,如 2019-12-13 14:15:16 。在查询使用数据时,往往又
会有不同的格式要求,这时就需要使用date_format()函数进行格式 转换。
示例如下:
select name, date_format(birthday, ‘%Y/%m/%d’) from user;
聚合函数
聚合函数是对一组值进行计算,并返回单个值。
MySQL常用的聚合函数有5个,分别是count、sum、avg、min和max。
函数 描述
count 返回符合条件的记录总数
sum 返回指定列的总和,忽略空值
avg 返回指定列的平均值,忽略空值
min 返回指定列的最小值,忽略空值
max 返回指定列的最大值,忽略空值
函数ifnull()
函数ifnull()用于处理NULL值。
ifnull(v1,v2),如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。
case when
case when是流程控制语句,可以在SQL语句中使用case when来获取更加准确和直接的结果。
SQL中的case when类似于编程语言中的if else或者switch。
#case when的语法有2种
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
CASE WHEN [expr] THEN [result1]…ELSE [default] END
MySQL索引的使用
常见的索引种类
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定
记录。
ü 数据库的索引好比一本书的目录,能够加快数据库的查询速度;
ü 索引是快速搜索的关键,如果不加索引,查找任何一条特定的数据都会进行一次全表扫描。
索引种类 描述
普通索引 最基本的索引,没有任何限制,仅加速查询。
唯一索引 索引列的值必须唯一,但允许有空值。
主键索引 一种特殊的唯一索引,不允许有空值。一般是在建表的同时自动创建主键索引。
复合索引 两个或多个列上的索引被称作复合索引。
全文索引 对文本内容进行分词索引。
索引的使用
1、创建索引
创建普通索引
CREATE INDEX indexName ON tableName(columnName(length));
创建唯一索引
CREATE UNIQUE INDEX indexName ON tableName(columnName(length));
创建复合索引
CREATE INDEX indexName ON tableName(columnName1, columnName2, …);
2、删除索引
DROP INDEX [indexName] ON tableName;
3、查看索引
SHOW INDEX FROM tableName;
复合索引前导列特性
在MySQL中,如果创建了复合索引(name, salary, dept),就相当于创建了(name, salary, dept)、 (name, salary)和(name)三个索引,这被称为复合索引前导列特性,因此在创建复合索引时应该将
最常用作查询条件的列放在最左边,依次递减。
未使用索引
select * from employee where salary=8800;
select * from employee where dept=‘部门A’;
select * from employee where salary=8800 and dept=‘部门A’;
使用索引
select * from employee where name=‘liufeng’;
select * from employee where name=‘liufeng’ and salary=8800;
select * from employee where name=‘liufeng’ and salary=8800 and dept=‘部门A’
触发器
触发器(trigger)用于监视某种情况并触发某种操作,它是与表事件相关的特殊的存储过程,它的
执行不是由程序调用,而是由事件来触发。例如,当对某张表进行insert、delete、update操作时
就会触发执行它。
#创建触发器语法
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW
trigger_stmt
参数说明:
trigger_name:触发器名称
trigger_time:触发时间,取值有before、after
trigger_event:触发事件,取值有insert、update、delete
table_name:触发器监控的表名
trigger_stmt:触发执行的语句,可以使用OLD、NEW来引用变化前后的记录内容
NEW.columnName:获取INSERT触发事件中新插入的数据
OLD.columnName:获取UPDATE和DELETE触发事件中被更新、删除的数据