MySQL系列(二):SQL优化
SQL优化角度:
SQL语句的优化:
- 查询的目标字段,数据范围越明确越好
- 避免在where中出现表达式操作,会导致引擎放弃索引
- 避免数据类型转化,如果目标数据是int在写SQL语句的时候就不要传入varchar
- 注意范围查询语句,会导致后面的索引字段失效
- 单独查询的时候,使用limit1,这是为了使EXPLAIN中type列达到const类型
- 多表查询的时候,尽量避免笛卡尔积
- 海量数据查询的时候,通过程序拆分为分段查询,进行批处理后将最后的结果合并
- 海量数据查询返回的时候,分页显示
- 查询避免判空和不等于操作,会造成引擎放弃索引全表扫描
- 区分好IN和EXISTS
IN和EXISTS驱动顺序不一样,IN是先执行子查询,而EXISTS是先执行外查询 IN适合内表小外表大的情况,EXISTS适合外表小内表大的情况
- 对于连续数据集,能够用BETWEEN的不用IN,如果要用IN保持数据集的有序性和少数性
- 避免使用NOT IN,可能存在逻辑问题,尽量用NOT EXISTS来代替
查询A表中不在B表的数据 select column from tablea left join tableb where A.id = B.id and B.id = null
- 避免使用or
- 避免左模糊 like '%XX'查询
- 避免* ,会造成全表扫描,浪费系统资源
- 如果排序的目标字段没有索引,尽量减少排序的使用
数据库表的设计:
1.字段设计的时候尽量是数字型的,如果是字符型的数据在查询的时候需要逐个比较
2.新建索引:索引的建立需要慎重,不正确的索引只会增加存储数据处理的开销
- 主键外键必有索引
- 数据量超过300的表应该有索引
- 经常需要进行连接操作的表,在连接字段上应该建立索引
- 经常出现在Where中的字段应该建立索引
缓存:
- 开启MySQL的一二级缓存
- 添加Redis的缓存层
分库分表
- 将历史数据保存到另一个数据库中