在业务系统中,由于上级接口的变化,我们需要不断的在一张特别大的表上新增字段、同时修改源码。为了后续新增字段方便,我们在表上添加了一列 extra_config,用来存储后续添加的字段
- 建表
sql
create table outer_order
(
id bigint primary key auto_increment,
extra_config json,
create_time datetime(3) DEFAULT CURRENT_TIMESTAMP(3),
update_time datetime(3) default null ON UPDATE CURRENT_TIMESTAMP(3)
);
- 插入数据
sql
insert into outer_order (extra_config)
values ('{"zipcode":"430101","price": 1.92, "quantity": 1, "alias_array": [1,3]}'),
('{"zipcode":"430102","price": 2.92, "quantity": 2, "alias_array": [2,3]}'),
('{"zipcode":"430103","price": 3.92, "quantity": 3, "alias_array": [4,3]}'),
('{"zipcode":"430104","price": 4.92, "quantity": 4, "alias_array": [5,3]}'),
('{"zipcode":"430105","price": 5.92, "quantity": 5, "alias_array": [6,3]}'),
('{"zipcode":"430106","price": 6.92, "quantity": 6, "alias_array": [7,3]}'),
('{"zipcode":"430107","price": 7.92, "quantity": 7, "alias_array": [8,3]}'),
('{"zipcode":"430107","price": 8.92, "quantity": 8, "alias_array": [9,3]}')
;
- 添加虚拟列
sql
alter table outer_order add column extra_config_price decimal(11,2) generated always as (extra_config->>'$.price') not null;
- 添加索引
sql
alter table outer_order add index idx_vm_extra_config_price (extra_config_price);
- 使用索引
sql
explain select id from outer_order where extra_config_price = 1.92;
结果如下
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: outer_order
partitions: NULL
type: ref
possible_keys: idx_vm_extra_config_price
key: idx_vm_extra_config_price
key_len: 5
ref: const
rows: 1
filtered: 100.00
Extra: Using index
1 row in set, 1 warning (0.00 sec)