关于mysql数据库查询对于区分度不大字段的验证

也是最近工作中遇到的,对于区分度不大的字段需不需要建索引,比如现在大部分公司应该都是逻辑删除数据,那么is_delete字段也就是只有0(未删除)跟1(已删除),因此来验证下,,也就是只有0跟1的字段建不建索引到底有没有区别。

一、下图是表结构,有四十个字段,目前原始表除了主键都没加索引

create table test
(
    ID                  bigint auto_increment
        primary key,
    ACTIVITY_ID         bigint                 null,
    STATUS_ID           bigint                 null,
    COUPON_CODE         varchar(50)            null,
    COUPON_NAME         varchar(200)           null,
    COUPON_IMG1         varchar(200)           null,
    AMOUNT              decimal(16, 2)         null,
    SEQ                 bigint                 null,
    COMMENTS            varchar(2000)          null,
    EXPIRE_TYPE         varchar(20)            null,
    AFTER_DATE          varchar(20)            null,
    EXPIRE_VALUE        varchar(20)            null,
    FROM_DATE           char(8)                null,
    THRU_DATE           char(8)                null,
    TOTAL_QUANTITY      bigint                 null,
    ISSUE_QUANTITY      bigint                 null,
    AVAILABLE_QUANTITY  bigint                 null,
    USED_QUANTITY       bigint                 null,
    THRU_GRAB_TIME      char(14)               null,
    EXT_FIELD_1         varchar(2000)          null,
    EXT_FIELD_2         varchar(2000)          null,
    EXT_FIELD_3         varchar(2000)          null,
    EXT_FIELD_4         varchar(2000)          null,
    EXT_FIELD_5         varchar(500)           null,
    EXT_FIELD_6         varchar(10)            null,
    EXT_FIELD_7         varchar(500)           null,
    EXT_FIELD_8         varchar(10)            null,
    USE_NUMBER          int                    null,
    SHARE_TITLE         varchar(100)           null,
    SHARE_TYPE          bigint                 null,
    SHARE_REMARK        varchar(500)           null,
    JUMP_LINK           varchar(500)           null,
    BATCH_NUMBER        varchar(30)            null,
    EXTERNAL_JUMP_URL   varchar(200)           null,
    BUTTON_VERBAL_TRICK varchar(20) default '' null,
    IS_DELETE           tinyint(2)  default 0  null,
    CREATE_TIME         datetime               null,
    CREATE_BY           varchar(100)           null,
    UPDATE_TIME         datetime               null,
    UPDATE_BY           varchar(100)           null
);

数据含大部分文本内容

在这里插入图片描述

1、下图是全表的数据量,有320多万,纯纯里面创建的测试数据就占了我85G左右的空间,不带日志空间

表总数据量

2、 下图是全表查询所需时间,1小时43分钟左右,没任何条件

执行全表查询所需时间

3、 接着下图验证带is_delete=0的条件所需时间,字段没加索引

查询出了大约一半的数据,所需时间在46分钟左右

带条件无索引查询

4、 接着下图带多条件查询,状态是1以及开始及结束时间在2023年一整年的数据,无索引

结果数据五万多条,查询近十分钟
带多条件查询

二、 接下来验证添加索引后的查询速度,不考虑索引顺序,只测试加了索引后的速度

1、只添加了is_delete字段的索引,用了近42分钟
添加索引后的查询

下面我又对另外三个查询字段分别加了索引

在这里插入图片描述

2、都各自加了索引后再次查询仅用了不到一分半的时间

加条件查询

随后我更改了索引的创建,将之前的单字段索引改成了联合索引

在这里插入图片描述

3、只是将另外三个加了联合索引,跟各自加相差无几

加索引查询

现在改成四个字段加成联合索引

加索引查询

4、四个字段加成联合索引

可以看到联合索引还是有些许提升的,虽然不大
加索引查询

修改索引,联合索引中去掉is_delete

加索引查询

5、去掉is_delete,只有另外三个字段是联合索引的情况

看来加不加还真的不重要啊
加索引查询

6、使用覆盖索引查询

EXPLAIN SELECT id,STATUS_ID,FROM_DATE from test WHERE STATUS_ID = 1 and FROM_DATE = ‘20200710’ ;
只查询索引所包含的列,包括主键id是都会使用索引的,使用覆盖索引能更快速的返回数据。

暂时想到验证这些,后续想到在验证什么的话会随时补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼儿飛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值