1.常用的时间函数
时间函数 | 描述 |
now() | 返回当前的日期及时间 |
curdate() | 返回当前的日期 |
curtime() | 返回当前的时间 |
week() | 返回指定时间是一年中的第几周 |
year() | 返回指定时间的年份 |
minute() | 返回指定时间的分钟 |
hour() | 返回指定时间的小时数 |
monthname() | 返回指定时间的月份名 |
date_format() | 格式化指定时间 |
date_add() | 返回加上一个时间间隔的时间值 |
2.sql语言分类
DDL:数据定义语言,常用关键词:create、drop、alter、show
DCL:数据控制语言,常用关键词:grant、if
DML:数据操作语言,常用关键词:insert、update、delete
DQL:数据查询语言,常用关键词:select
3.事务
①指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么都成功,要么都失败
②事务特点(ACID)
特征 | 含义 |
原子性(Atomicity) | 每个事务都是一个整体,不可再拆分,事务中所有的sql语句要么都执行成功,要么都失败 |
一致性(Consistency) | 事务在执行前数据库的状态与执行后数据库的状态保持一致。 |
隔离性(Isolation) | 事务与事务之间不应该相互影响,执行时保持隔离的状态 |
持久性(Durability) | 一旦事务执行成功,对数据库的修改是持久的,就算关机,也是保存下来的 |
③并发访问的问题
并发访问的问题 | 含义 |
脏读 | 一个事务读取到了另一个事务中尚未提交的数据 |
不可重复读 | 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题 |
幻读 | 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题 |
事务流程
begin;
select|update|insert|delete;
commit;|rollback;
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 READ UNCOMMITTED | 是 | 是 | 是 |
读提交 READ COMMITTED | 否 | 是 | 是 |
可重复读 REPEATABLE READ(mysql 默认的隔离级别) | 否 | 否 | 是 |
串行化 SERIALIZABLE | 否 | 否 | 否 |
查看当前的数据库的隔离级别
5.7+
select @@transaction_isolation;
5.7-
select @@tx_isolation;
修改事务隔离级别
set 作用域 transaction isolation level 事务隔离级别
作用域: session 当前页面 global 全局
查看当前有多少事务在运行
select * from information_schema.INNODB_TRX
4.分析事务隔离级别
复现脏读
(1)在窗口A修改隔离级别为读未提交
(2)新开窗口B查询事务隔离级别是否修改成功,如果修改成功,进入第三步,如果没有成功,
多试几次
(3)在窗口B,开启事务A,修改id为1的学生年龄从10变为100
(4)新开窗口C,开启事务B,查询id为1的学生年龄,100
(5)返回窗口B,用rollback结束事务A
(6)返回窗口C,再次查询,结束事务B,10
解决脏读,出现不可重复读
(1)修改事务隔离级别为读提交以上的级别
(2)重复操作去验证是否解决
解决不可重复读
(1)修改事务隔离级别为可重复读以上的级别
(2)重复操作去验证是否解决
5.索引
(1)索引是帮助Mysql高效获取数据的数据结构
(2)索引的优势
①提高查询效率(降低IO使用率)
②降低CPU使用率
(3)索引的弊端
①索引本身很大,可以存放在内存或硬盘上,通常存储在硬盘上
②索引不是所有情况都使用,比如少量数据、频繁变化的字段、很少使用的字段
③索引会降低增删改的效率
(4)索引的分类
①主键索引
②普通索引
存在表的情况下添加索引
alter table 表名 add index 索引名(作用的字段名)
创建表的情况下添加索引
create table 表名( 字段1 数据类型, 字段2 数据类型, index 索引名(作用的字段名) )
查看当前查询语句可用及用到的索引
EXPLAIN select * from 表名 where 字段名 = 值
删除索引
alter table 表名 drop index 索引名
③唯一索引
④联合索引
⑤全文索引