MySQL 中,只要表中存在 longblob 或者 longtext 类型的字段,并且数据量一多,那么对这张的查询操作将会变得非常缓慢,但使用单列索引就可以解决此类问题
问题重现
现在 MySQL 中有一张表,假设名为 imgs ,一共三个字段,id, mid, fileData,其中 id 为主键,mid 为关联表 id,fileData 为一个 longBlob 类型的字段
现在我们用脚本或者代码随机往 imgs 表中插入 10w 条左右的数据,再运行由 MyBatis 生成的查询 SQL:
select 'true' as QUERYID, id, mid, fileData from imgs WHERE ( mid = 1257 )
那么不出意外,运行这段 SQL 所需要的时间将会是非常高昂的成本(在我本地测试用了足足 5 秒)
对应到线上环境,5 秒的查询时间是不可能被允许的,必须优化
创建单列索引
我们可以分析,如此缓慢的查询,其本质原因就是因为 longBlob 字段造成的开销影响的,如果可以在查询之初就迅速定位一个较小的范围,那么就可以解决这个问题
而索引恰恰就能够完美的解决: 如果我们对 mid 创建索引 index,那么 MySQL 能够通过 where mid = 1257 迅速把搜索范围定位到 mid = 1257 的范围内,然后再去根据其他搜索条件去查找
运行以下 SQL 创建索引:
alter table imgs add index mid(mid);
之后再运行同样的查询语句:
select 'true' as QUERYID, id, mid, fileData from imgs WHERE ( mid = 1257 )
就可以解决问题,至少在我本地,由原本的 5 秒查询时间,缩短到了 0.02 秒