MysqlIN子句后面的时间范围查询到底能不能用到索引

database

​ 经常在网上看到 “IN” 子句用不到索引,或者 “IN” 后面的字段用不到索引,这里做个简单的测试。

步骤如下:

一、准备资料

1.表定义

​ 商品表:t_order

ID

商家ID(int)

店铺ID(int)

编码

名称

创建时间(datetime)

id

merchant_id

shop_id

code

name

create_time

​ 索引:商家ID + 店铺ID + 创建时间

2.预置数据

​ 方式:商家ID,店铺ID,创建时间 均匀分配预制数据,具体sql省略

二、测试

1.场景一

  • SQL

    SELECT

    *

    FROM

    t_order

    WHERE

    merchant_id = 136

    AND shop_id IN ( 581, 583 );

  • EXPLAIN

    • type为range,key_len为8个字节,扫描行 = 12

  • 结论

    IN可以用到range索引

2.场景二

  • SQL

    SELECT

    *

    FROM

    riv_outbound_notice_h t_order

    WHERE

    t_order.ONH_ORG_ID = 136

    AND t_order.ONH_OWNER_ID IN ( 581, 583 )

    AND t_order.CREATE_TIME BETWEEN "2019-11-19 00:00:00"

    AND "2019-11-22 00:00:00";

  • EXPLAIN

    • type = range,key_len = 13,扫描行 = 5

  • 结论

    IN后面的时间范围可以用到索引

以上是 MysqlIN子句后面的时间范围查询到底能不能用到索引 的全部内容, 来源链接: utcz.com/z/533912.html

回到顶部