参考文章 https://juejin.im/post/5a52386d51882573443c852a

我们都知道 SQL 的索引一般起到的作用是使得持久层的数据查询更快速,
但实际业务中,我们又会听到 SQL 索引失效,甚至普通的技术者以为只要创建了索引就一定有效,其实不然。
那如何才能进行 SQL 分析?如何知道是否使用了索引?
本次介绍 Mysql 的执行计划——EXPLAIN

查询业务开发的 SQL 逻辑

应用中的持久层逻辑如下

  1. SELECT oa.storeId,oa.storeNo FROM t_trade_order_area oa WHERE oa.areaId= #{areaId} and oa.orderStatus != 'CLOSED'
  2. AND oa.orderType = 'COMMODITY' AND oa.storeId in
  3. <foreach collection="storeIds" index="index" item="item" open="(" separator="," close=")">
  4. #{item}
  5. </foreach>
  6. AND EXISTS (select oia.subOrderId FROM t_trade_order_item_area oia WHERE oa.orderId = oia.orderId AND oia.productType = 'COMMODITY')
  7. GROUP BY oa.storeId

连接数据库,查看 DDL 的索引

image.png

使用‘执行计划’ EXPLAIN 运行SQL,示例如下

所谓的执行计划,就是检测Mysql如何执行一条Sql语句,包括Sql查询的顺序、是否使用索引、以及使用的索引信息等内容

  1. EXPLAIN
  2. SELECT oa.storeId,oa.storeNo FROM t_trade_order_area oa WHERE oa.areaId= '101' and oa.orderStatus != 'CLOSED'
  3. AND oa.orderType = 'COMMODITY' AND oa.storeId in ("66880000060403","66880000190203")
  4. AND EXISTS (select oia.subOrderId FROM t_trade_order_item_area oia WHERE oa.orderId = oia.orderId AND oia.productType = 'COMMODITY')
  5. GROUP BY oa.storeId

执行计划结果输出
image.png

重要字段的解释说明(图示) image.png

根据执行计划的结果,即可知道该业务逻辑所使用的索引确实生效了,字段为:orderId、storeId