当前位置:网站首页>【接口性能优化】索引失效的原因以及如何进行SQL优化
【接口性能优化】索引失效的原因以及如何进行SQL优化
2022-07-25 22:57:00 【七度_】
接口性能优化大家第一个想到的可能是:优化索引。
没错,优化索引的成本是最小的。
你通过查看线上日志或者监控报告,查到某个接口用到的某条sql语句耗时比较长。
这时你可能会有下面这些疑问:
该sql语句加索引了没?
加的索引生效了没?
mysql选错索引了没?
1.索引
1.1 没加索引
sql语句中where条件的关键字段,或者order by后面的排序字段,忘了加索引,这个问题在项目中很常见。
项目刚开始的时候,由于表中的数据量小,加不加索引sql查询性能差别不大。
后来,随着业务的发展,表中数据量越来越多,就不得不加索引了。
可以通过命令:
show index from `order`;
能单独查看某张表的索引情况。
也可以通过命令:
show create table `order`;
查看整张表的建表语句,里面同样会显示索引情况。
通过ALTER TABLE命令可以添加索引:
ALTER TABLE `order` ADD INDEX idx_name (name);
也可以通过CREATE INDEX命令添加索引:
CREATE INDEX idx_name ON `order` (name);
不过这里有一个需要注意的地方是:想通过命令修改索引,是不行的。
目前在mysql中如果想要修改索引,只能先删除索引,再重新添加新的。
删除索引可以用DROP INDEX命令:
ALTER TABLE `order` DROP INDEX idx_name;
用DROP INDEX命令也行:
DROP INDEX idx_name ON `order`;
1.2 索引没生效
通过上面的命令我们已经能够确认索引是有的,但它生效了没?此时你内心或许会冒出这样一个疑问。
那么,如何查看索引有没有生效呢?
答:可以使用explain命令,查看mysql的执行计划,它会显示索引的使用情况。
例如:
explain select * from `order` where code='002';
结果:

通过这几列可以判断索引使用情况,执行计划包含列的含义如下图所示:如果你想进一步了解explain的详细用法,可以看看我的另一篇文章《explain | 索引优化的这把绝世好剑,你真的会用吗?》
说实话,sql语句没有走索引,排除没有建索引之外,最大的可能性是索引失效了。
下面说说索引失效的常见原因:

如果不是上面的这些原因,则需要再进一步排查一下其他原因。
1.3 选错索引
此外,你有没有遇到过这样一种情况:明明是同一条sql,只有入参不同而已。有的时候走的索引a,有的时候却走的索引b?
没错,有时候mysql会选错索引。
必要时可以使用force index来强制查询sql走某个索引。
至于为什么mysql会选错索引,后面有专门的文章介绍的,这里先留点悬念。
2. sql优化
如果优化了索引之后,也没啥效果。
接下来试着优化一下sql语句,因为它的改造成本相对于java代码来说也要小得多。
下面给大家列举了sql优化的15个小技巧:

边栏推荐
- Shanghai Second Polytechnic University - Health Daily autocheck
- PE格式: 分析IatHook并实现
- 我们为什么要推出Getaverse?
- Network Security Learning (XII) OSI and TCP
- [tensorflow] 关于 seed
- 【MySQL提权】UDF提权(附带大马)
- Ribbon execution logic source code analysis
- PE format: analyze and implement IATHOOK
- CUDA environment construction
- JSON object
猜你喜欢

Network Security Learning (XV) ARP

How painful is it to write unit tests?

【MySQL提权】UDF提权(附带大马)

Notification设置的小图标显示的是小方块
![[training Day12] x equation [high precision] [mathematics]](/img/4f/51d902e925f9ec60da46d161ed4d17.png)
[training Day12] x equation [high precision] [mathematics]

Network Security Learning (XIV) IP protocol

Two methods of printing strings in reverse order in C language

How to obtain the cash flow data of advertising services to help analyze the advertising effect?

MatrixCube揭秘102——300行实现的完整分布式存储系统MatrixKV

Qt的TQTreeWidget控件
随机推荐
[opencv] edge detection [API and source code implementation]
Simple setting of drop-down triangle
自媒体人必备的4个素材网站,再也不用担心找不到素材
Extended configuration of static routing in the second experiment
Examples and points for attention about the use of getchar and scanf
access-list vs ip access-list
【自然语言处理】【向量表示】AugSBERT:改善用于成对句子评分任务的Bi-Encoders的数据增强方法
2020-09-17
JD quick navigation box
Network Security Learning (XII) OSI and TCP
[training day13] Internet [concurrent search]
Deep recursion, deep search DFS, backtracking, paper cutting learning.
The fourth experiment nat
如何获取广告服务流量变现数据,助力广告效果分析?
内存分页与调优,内核与用户空间
MySQL data type
栈与Stack类
Ribbon execution logic source code analysis
Anaconda~Upload did not complete.
Learning notes of technical art hundred people plan (2) -- vector