SQL 学习笔记

记一些不好记的

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慢查询日志开关
        slow_query_log=1
        # 设置时间阈值为2秒
        long_query_time=2
    • /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
img_show