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 常见知识点
查询关键字的执行顺序
- from
- on
- join
- where
- group by
- having
- select
- dintinct
- order by
- limit
having 和 where 的区别
having 不可以替代 where,group by 分组后需要进行筛选数据时用 having
| where | having |
|---|---|
| 不可以使用聚合函数 | 可以使用聚合函数 |
| 数据在 group by 前过滤 | 数据在 group by 后过滤 |
| 查询条件中不可以使用字段别名 | 查询条件中可以使用字段别名 |
| 用于过滤数据行 | 用于过滤分组后的结果集 |
| 根据数据表的字段直接过滤 | 根据已查询出来的字段进行过滤,未查询出来的值无法查询使用 having |
mysql 事务
什么是事务?
- 事务就是一组具有原子性、一致性的操作,用来保证这一组数据库操作,要么全部成功,要么全部失败
- 事务是在引擎层实现的
mysql 事务的四大特性
- 原子性:不可再分割,一个事务是数据处理操作的最小单元
- 一致性:事务中的语句要么全部成功,要么全部失败,只要有一条语句失败了,这个事务的全部语句都要进行回滚
- 隔离性:每个事务相互隔离,事务A即使没有提交,对其它事务也是不可见的
持久性:事务就数据的改动是持久性的,即使系统出现故障,也可以通过回滚日志来恢复
mysql索引
什么是索引?
数据表中对一个或多个列的值进行排序,是帮助 mysql 进行高效检索数据的数据结构
索引的优势
- 提高数据查询效率
- 保证行的唯一性
- 加快表之间的连接
- 用来排序或分组的字段添加索引可以加快分组或排序
索引的缺点
- 创建索引和维护索引需要时间成本,成本随数据量增大而增大
- 创建索引和维护所以需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量大占用空间就越大
- 加快了查询效率,但降低了增删改效率,每次增删改都要动态维护索引,降低数据维护速度
需要用索引的场景
- 经常需要查询的列,可以加快查询速度
- 经常用在连接的列,可以加快连接速度
- 进场需要排序的列,可以加快排序查询时间
- 经常跟在where后的列,可以加快条件判断速度
- 仅对索引查询,当查询的列都在索引字段中,查询效率会更高
mysql 调优
查看某一条sql是否为慢查询
查看慢查询日志状态select * from table_a where COMMAND != 'Sleep';
开启慢查询日志show variables like 'slow_query_log';
```plsqlset global slow_query_log = 1# 开启慢查询日志后,查询时间超过10s的会被记录。这个时间由字段 long_query_time 控制
查看慢查询时间阀值
show variables like ‘long_query_time’;
设置慢查询时间阀值
当sql执行时间超过4s时,会记录到慢查询日志中,等于4s不记录
set global long_query_time=4;
查询慢查询所在位置```plsqlshow variables like 'slow_query_log_file';# 日志文件默认显示在:/usr/local/mysql/data/slow.log
查看正在进行的慢查询
show processlistshow full processlist
