整理一下一些琐碎的不熟悉的知识点

1.sql执行顺序

  • from/join 确定数据源
  • where 过滤行
  • group by 分组
  • 聚合函数 SUM/COUNT
  • HAVING 过滤分组
  • select 选择列
  • distinct 去重
  • order by 排序
  • limit/offset 分页

2. mysql默认端口号:3306

3.字段类型

  • char/varchar
    char:定长,会填充空格达到指定长度,适合存储长度较短或者长度近似的字符串
    varchar:变长,用1到2个额外字节存储字符串长度,适合存储长度不确定或者差异较大的字符串
  • decimal:定长型,可以存储精确的小数值; float/double:存储近似的小数值

4.NULL

  • NULL代表一个不确定的值,不等于任何值
  • 任何值与NULL比较(= != > <)的结果都是NULL;判断一个值是否为NULL,要用IS NULL/IS NOT NULL判断
  • 聚合函数SUM/AVG/MIN/MAX会忽略NULL值,COUNT(*)会统计所有行数包括NULL,COUNT(列名)不统计NULL

5.innodb和myisam

  • innodb支持行锁;提供事务管理;支持外键;支持mvcc;数据也是索引结构(myisam中数据和索引分开);支持安全恢复(redo log)

6.行级锁

  • 加在索引字段上,对当前操作的行进行加锁。存储引擎层实现。
  • 执行update、delete假设where没有命中索引或者索引失效,会扫描全表对所有行加锁。
  • 行锁:1.记录锁:单个行记录上的锁;2.间隙锁:锁定一个范围 3.nextkeylock(1+2):锁住记录+范围,解决幻读。默认可重复度,默认nextkeylock。假设命中唯一索引会降级为record lock。

7.共享锁/排他锁:

  • 共享/读锁/s锁:锁兼容;
  • 排他/写锁/x锁:锁不兼容;

8.意向锁:表级锁。数据引擎维护的,用户无法手动操作。

  • 意向共享锁is锁:有意对某些记录加共享锁s锁,先获得is锁;
  • 意向排他锁ix锁:有意对某些记录加排他锁x锁,先获得的ix锁
  • 意向锁之间互相兼容。

9.执行计划EXPLAIN

10.sql优化:

  • 慢sql定位:mysql慢查询日志、explain命令分析
  • 索引优化、表结构优化(范式、反范式)、sql优化(避免select *、连接查询代替子查询)
  • 架构优化:读写分离、分库分表、冷热分离、redis缓存
  • 其他:连接池配置(大小、超时时间)、硬件配置

11.子查询:子查询性能差的原因:子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能会受到一定的影响。

12.覆盖索引

  • 包含了完整的数据行,所有列数据,可以直接返回结果;
  • 二级索引:只包含id+索引列数据,还需要用id回表查询其他字段。

13.mysql连接池

  • 在启动的适合创建一定数量的数据库连接,并保存在一个池中,应用程序可以动态地从池中申请、使用和释放连接,而不是每次和数据库进行交互时再创建新的连接。
  • 避免每次执行sql时需要重新建立tcp连接以及mysql的认证,复用连接,减少性能开销。