• 【接口性能优化】一、SQL优化篇


    接口性能优化大家第一个想到的可能是:优化索引

    没错,优化索引的成本是最小的。

    你通过查看线上日志或者监控报告,查到某个接口用到的某条sql语句耗时比较长。

    这时你可能会有下面这些疑问:

    1. 该sql语句加索引了没?

    2. 加的索引生效了没?

    3. mysql选错索引了没?

    1.索引

    1.1 没加索引

    sql语句中where条件的关键字段,或者order by后面的排序字段,忘了加索引,这个问题在项目中很常见。

    项目刚开始的时候,由于表中的数据量小,加不加索引sql查询性能差别不大。

    后来,随着业务的发展,表中数据量越来越多,就不得不加索引了。

    可以通过命令:

    show index from `order`;
    

    能单独查看某张表的索引情况。

    也可以通过命令:

    show create table `order`;
    

    查看整张表的建表语句,里面同样会显示索引情况。

    通过ALTER TABLE命令可以添加索引:

    ALTER TABLE `orderADD INDEX idx_name (name);
    

    也可以通过CREATE INDEX命令添加索引:

    CREATE INDEX idx_name ON `order` (name);
    

    不过这里有一个需要注意的地方是:想通过命令修改索引,是不行的。

    目前在mysql中如果想要修改索引,只能先删除索引,再重新添加新的。

    删除索引可以用DROP INDEX命令:

    ALTER TABLE `orderDROP INDEX idx_name;
    

    DROP INDEX命令也行:

    DROP INDEX idx_name ON `order`;
    

    1.2 索引没生效

    通过上面的命令我们已经能够确认索引是有的,但它生效了没?此时你内心或许会冒出这样一个疑问。

    那么,如何查看索引有没有生效呢?

    答:可以使用explain命令,查看mysql的执行计划,它会显示索引的使用情况。

    例如:

    explain select * from `orderwhere code='002';
    

    结果:

    通过这几列可以判断索引使用情况,执行计划包含列的含义如下图所示:如果你想进一步了解explain的详细用法,可以看看我的另一篇文章《explain | 索引优化的这把绝世好剑,你真的会用吗?

    说实话,sql语句没有走索引,排除没有建索引之外,最大的可能性是索引失效了。

    下面说说索引失效的常见原因:

    如果不是上面的这些原因,则需要再进一步排查一下其他原因。

    1.3 选错索引

    此外,你有没有遇到过这样一种情况:明明是同一条sql,只有入参不同而已。有的时候走的索引a,有的时候却走的索引b?

    没错,有时候mysql会选错索引。

    必要时可以使用force index来强制查询sql走某个索引。

    至于为什么mysql会选错索引,后面有专门的文章介绍的,这里先留点悬念。

    2. sql优化

    如果优化了索引之后,也没啥效果。

    接下来试着优化一下sql语句,因为它的改造成本相对于java代码来说也要小得多。

    下面给大家列举了sql优化的15个小技巧:

  • 相关阅读:
    Java的一些常见类【万字介绍】
    数字格式化
    怀孕也不算-《软件方法》自测题解析023
    关于 arduino 中的 random()和randomSeed()的使用
    章节十一:定时与邮件
    系统架构设计:14 论软基于架构的软件设计方法(ABSD)的软件开发
    带你深入把握MySQL优化之精髓
    等数值计算方法学习笔记第4章第三部分【数值积分(数值微分)】
    Flink系列之Flink集群搭建
    00、数组及字符串常用的 API(详细剖析)
  • 原文地址:https://blog.csdn.net/gongzi_9/article/details/125900744