一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
SQL优化
SQL优化的目的是为了SQL语句能供具备优秀的查询性能
工程优化如何实现:数据库标准、表的结构标准、字段的标准、创建索引
SQL语句的优化:当前SQL语句有没有命中索引。
show warnings:查看内部优化器优化的效果
join优化
遵循小表驱动大表原则
在join中会涉及到大表(数据量大)和小表(数据量小)的概念。MySQL内部优化器会根据关联字段是否创建了索引来使用不同的算法:
- Nlj(嵌套循环算法):如果关联字段使用了索引,MySQL会对小表进行全表扫描,用小表放到缓冲区中,然后全表扫描大表,把大表的数据和缓冲区中的小表数据在内存中进行匹配。
- bnlj(块嵌套循环):如果关联字段没有使用索引,MySQL会提供一个join buffer 缓冲区,先把小表放到缓冲区中,然后全表扫描大表,把大表的数据和缓冲区中的小表数据在内存中进行匹配。
结论:使用join查询时,一定要建立关联字段的索引,且两张表的关联字段在设计之初就要做到字段类型,长度是一致的,否则索引会失效的。
in和exists优化
在sql中如果A表是大表,B表是小表,那么使用in会更加合适。反之应该使用exists。
in:B的数据量<A的数据量
select * from A Where id in (select id from B)
#相当于:
for(select id from B){ //B的数据量少,所以循环次数少。
select * from A where A.id = B.id
}
exists:B的数据量>A的数据量(10: id 1 2 3 4 )
select * from A where exists (select 1 from B where B.id = A.id) true/false
for(select * from A){
select * from B where B.id = A.id
}
count优化
对于count的优化应该是架构层面的优化,因为count的统计是在一个产品会经常出现,而且每个用户访问,所以对于访问频率过高的数据建议维护在缓存中。将总行数在缓存redis中维护