mysql 关注点

1、表字段是否多余
2、表字段长度是否合适

  • 布尔和枚举建议 tiny
  • 日期和时间戳:timestamp 或 int
  • 字符类型:char,text,blob 等建议经量使用符合长度的 varchar(n)
  • 小数和货币:移位转为int或者 decimal
  • 小数和货币:移位转为int或者 decimal
  • ip 地址:int

3、表字段是否需要加密
4、表是否需要创建对应索引

  • 索引字段的顺序考虑字段的选择性,选择性高的放前面(选择性高:字段不重复)
  • 合理使用联合索引,避免多个冗余的单个索
  • 合理利用覆盖索引

5、sql 是否能命中合适的索引

  • 如果没有能力静态分析,就依靠线下 sql 分析工具,或者手工做参数替换后拿到线上去做 explain,重点关注 type 和 extra 字段

6、sql 查询是否只查需要的字段,禁止select *
7、sql 未来的增速预估及性能保证方案是否有考虑

  • 垂直拆分:按业务将表拆分到不同的库
  • 水平拆分:分表分库
  • 读写分离:在业务允许的情况下,在从库中读取非实时数据
  • 定时归档
  • 缩小查询范围:时间或者业务范围

8、不建议 sql 使用子查询
9、不建议 sql 中 join 超过3张表
10、模糊查询%要加在后面
11、模糊查询很多的场景,是否使用 ES 更合理?
12、注意隐式类型转换的危害
13、尽量不在 sql 中做数学运算,函数计算等
14、group by 时会默认排序,如果业务没必要排序,建议加 order by null
15、禁止使用存储过程,函数、触发器、外键约束
16、sql 的超时是否需要设置 (一般是100mm,mybatis 设置/数据库连接池)
17、能不使用事务的,就不要使用事务,优先使用其它方式保证数据一致性
18、事务的跨度要尽量小
19、分表分库涉及时,要考虑到数据分布均匀,避免单库 或 单表数据倾斜

mysql 常见知识点

查询关键字的执行顺序

  1. from
  2. on
  3. join
  4. where
  5. group by
  6. having
  7. select
  8. dintinct
  9. order by
  10. limit

    having 和 where 的区别

    having 不可以替代 where,group by 分组后需要进行筛选数据时用 having
where having
不可以使用聚合函数 可以使用聚合函数
数据在 group by 前过滤 数据在 group by 后过滤
查询条件中不可以使用字段别名 查询条件中可以使用字段别名
用于过滤数据行 用于过滤分组后的结果集
根据数据表的字段直接过滤 根据已查询出来的字段进行过滤,未查询出来的值无法查询使用 having

mysql 事务

什么是事务?

  • 事务就是一组具有原子性、一致性的操作,用来保证这一组数据库操作,要么全部成功,要么全部失败
  • 事务是在引擎层实现的

mysql 事务的四大特性

  • 原子性:不可再分割,一个事务是数据处理操作的最小单元
  • 一致性:事务中的语句要么全部成功,要么全部失败,只要有一条语句失败了,这个事务的全部语句都要进行回滚
  • 隔离性:每个事务相互隔离,事务A即使没有提交,对其它事务也是不可见的
  • 持久性:事务就数据的改动是持久性的,即使系统出现故障,也可以通过回滚日志来恢复

    mysql索引

    什么是索引?

  • 数据表中对一个或多个列的值进行排序,是帮助 mysql 进行高效检索数据的数据结构

索引的优势

  • 提高数据查询效率
  • 保证行的唯一性
  • 加快表之间的连接
  • 用来排序或分组的字段添加索引可以加快分组或排序

索引的缺点

  • 创建索引和维护索引需要时间成本,成本随数据量增大而增大
  • 创建索引和维护所以需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量大占用空间就越大
  • 加快了查询效率,但降低了增删改效率,每次增删改都要动态维护索引,降低数据维护速度

需要用索引的场景

  • 经常需要查询的列,可以加快查询速度
  • 经常用在连接的列,可以加快连接速度
  • 进场需要排序的列,可以加快排序查询时间
  • 经常跟在where后的列,可以加快条件判断速度
  • 仅对索引查询,当查询的列都在索引字段中,查询效率会更高

    mysql 调优

    查看某一条sql是否为慢查询
    1. select * from table_a where COMMAND != 'Sleep';
    查看慢查询日志状态
    1. show variables like 'slow_query_log';
    开启慢查询日志
    1. set global slow_query_log = 1
    2. # 开启慢查询日志后,查询时间超过10s的会被记录。这个时间由字段 long_query_time 控制
    ```plsql

    查看慢查询时间阀值

    show variables like ‘long_query_time’;

设置慢查询时间阀值

当sql执行时间超过4s时,会记录到慢查询日志中,等于4s不记录

set global long_query_time=4;

  1. 查询慢查询所在位置
  2. ```plsql
  3. show variables like 'slow_query_log_file';
  4. # 日志文件默认显示在:/usr/local/mysql/data/slow.log

查看正在进行的慢查询

  1. show processlist
  2. show full processlist