MySQL查询效率优化思路
前段时间老大重构我之前写的一部分代码,由于当时写的sql的查询效率的原因被批了一顿,所以考虑研究记录一下sql优化的思路。
1、不修改表结构的方案
一般在不改变数据表结构的情况下可以考虑通过增加索引的方式来提高sql 的查询效率。在这之前可以通过EXPLAIN语句来查看一下当前sql的查询类型“type”列的类型。譬如这样:
这个字段的内容可以一定程度上反应sql的查询效率。下面我这边列举一下这个字段的内容以及对应的意义(对应的效率从最高到最低):
const 读常量,最多只会有一条记录匹配,由于是常量,实际上只须要读一次
eq_ref 最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问
ref Join语句中被驱动表索引引用的查询
range 索引范围扫描
index 全索引扫描
ALL 全表扫描
因此截图中的语句的查询效率是最差的一等,我们当然不能坐视这么离谱的事情发生。这边我考虑给查询条件增加一个索引。
红框里的那个索引是新加的,然后让我们来看一下操作后的变化:
type从之前的ALL变成了range,一定程度上提高了查询效率。
2、可以修改表结构的方案
如果修改表结构的话可以考虑数据的冗余。这边不方便举具体的例子,大概说一下,这种方案可以应对一次查询需要获取的数据散落在多个通过某些字段作为逻辑外键连接在一起的表中。如果用多表连接查询的方式,在数据量小的时候可能没什么感觉,但是数据量达到几十万条往上的时候,页面搜索的体验极差。这是由于多表连接时所要查询的逻辑表会由于连接的原因导致其数据量变得十分巨大。对一张数据量巨大的表进行查询自然会导致查询效率低下。
解决这个问题的方法就是修改表结构的设计,将散落的数据集中到一张表中,避免了由于多表连接所造成的弊端。
这种情况