参考文章 https://juejin.im/post/5a52386d51882573443c852a
我们都知道 SQL 的索引一般起到的作用是使得持久层的数据查询更快速,
但实际业务中,我们又会听到 SQL 索引失效,甚至普通的技术者以为只要创建了索引就一定有效,其实不然。
那如何才能进行 SQL 分析?如何知道是否使用了索引?
本次介绍 Mysql 的执行计划——EXPLAIN
查询业务开发的 SQL 逻辑
应用中的持久层逻辑如下
SELECT oa.storeId,oa.storeNo FROM t_trade_order_area oa WHERE oa.areaId= #{areaId} and oa.orderStatus != 'CLOSED'
AND oa.orderType = 'COMMODITY' AND oa.storeId in
<foreach collection="storeIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
AND EXISTS (select oia.subOrderId FROM t_trade_order_item_area oia WHERE oa.orderId = oia.orderId AND oia.productType = 'COMMODITY')
GROUP BY oa.storeId
连接数据库,查看 DDL 的索引
使用‘执行计划’ EXPLAIN 运行SQL,示例如下
所谓的执行计划,就是检测Mysql
如何执行一条Sql
语句,包括Sql
查询的顺序、是否使用索引、以及使用的索引信息等内容
EXPLAIN
SELECT oa.storeId,oa.storeNo FROM t_trade_order_area oa WHERE oa.areaId= '101' and oa.orderStatus != 'CLOSED'
AND oa.orderType = 'COMMODITY' AND oa.storeId in ("66880000060403","66880000190203")
AND EXISTS (select oia.subOrderId FROM t_trade_order_item_area oia WHERE oa.orderId = oia.orderId AND oia.productType = 'COMMODITY')
GROUP BY oa.storeId;
执行计划结果输出
重要字段的解释说明(图示)
根据执行计划的结果,即可知道该业务逻辑所使用的索引确实生效了,字段为:orderId、storeId