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 秒
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于