MySQL索引(二)

76 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

SQL优化

SQL优化的目的是为了SQL语句能供具备优秀的查询性能
工程优化如何实现:数据库标准、表的结构标准、字段的标准、创建索引
SQL语句的优化:当前SQL语句有没有命中索引。

image.png

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中维护

image.png