记一些不好记的
SQL分类
- DDL:数据定义语言
- DML:数据操作语言
- DQL:数据查询语言
- DCL:数据控制语言
事务的四大特性(ACID)
- 原子性(Atomicity):事务是不可分割的最小操作单元
- 一致性(Consistency):事务完成时,必须使所有数据保持一致
- 隔离性(Isolation):保证事务在不受外部并发操作影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中数据的改变是永久的
并发事务问题
- 脏读:一个事务读到另外一个事务还没有提交的数据
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在
事务隔离级别
- Read uncommitted:脏读、不可重复读、幻读
- Read committed(Oracle默认):不可重复读、幻读
- Repeatable Read(SQL默认):幻读
- Serializable
从上到下性能依次降低,隔离级别逐渐提高
性能优化
查看执行频次
show global status like 'Com%';
:展示当前数据库中各个操作已经进行的次数
慢查询日志
记录了所有执行时间超过指定参数(
long_query_time
秒)的所有SQL语句默认没有开启,需要在MySQL的配置文件(
/etc/my.cnf
)中配置:show variables like 'slow_query_log';
# 开启MySQL慢查询日志开关=1 slow_query_log # 设置时间阈值为2秒=2 long_query_time
/var/lib/mysql/localhost-slow.log
用
tail -f localhost-slow.log
可以看到持续的输出
profile详情
show profiles
可以在做SQL优化的时候看到时间都用在哪里- 通过
SELECT @@have_profiling
可以看到当前MySQL是否支持profile操作 - 默认
profiling
是关闭的,通过SET profiling=1
打开、 show profiles;
显示所有语句耗时
explain
- 通过在sql语句前加explain获取执行计划
- explain执行计划各字段含义:
- id:select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)
- select_type:表示select的类型,常见的有simple(简单表,不使用表连接或者子查询、primary(主查询,即外层的查询)、union(union中的第二个或者后面的查询语句)、subquery(select/where之后包含了子查询)等
- type:表示连接类型,性能由好到差为:NULL、system、const、eq_ref、ref、range、index、all