也是最近工作中遇到的,对于区分度不大的字段需不需要建索引,比如现在大部分公司应该都是逻辑删除数据,那么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是都会使用索引的,使用覆盖索引能更快速的返回数据。