前言
事情是这样的:线上环境有个单表,数据才3000多笔,每次按条件过滤都要2秒左右,简直无法理解。抱着好奇心,我决定研究一下到底是什么情况。
索引分析
explain select * from **** ,发现并没有走索引。
将索引加上之后,速度从2秒变成0.1秒不到。
但是呢,正常情况下3000笔数据就算不走索引,查询也应该是毫秒级响应,所以继续排查其他原因
表结构分析
查看该表的字段,发现有个 LongText 类型的字段 props,存储了大量JSON数据和BASE64的图片(不要问我为什么这样存,有些项目就是这么的匪夷所思!!!!)此外,整张表虽然才3000多笔数据,但是占用空间达到了2G,就是拜LongText字段所赐。
我们将 props 字段从 select 返回的字段中移除,发现速度飞快,但是这个字段又是必须的,那怎么解决呢?
解决方案
方案一: 根据where条件创建索引,上面演示过了
方案二:把 props 字段放到单独的表,先把对应的 id 都查出来,再去这张表取出需要的 props 数据,可以大大地减少 LongText 字段的扫描次数。