#####################
OS:CentOS 7
DB:mysql 5.7
时间:2019.06
#####################
最近有一个项目遇到性能问题,我这里把优化的方法分享出来(这个方案并非谁独创,而是mysql 官方为实现函数索引的替代方法)。
问题是这样的:我们需要从一个JSON 字段中取出相应的项作为 where 子句的条件,如下:
CREATE TABLE `xxxxxx` ( `id` varchar(96) DEFAULT NULL, `gid` varchar(96) DEFAULT NULL, `user_id` varchar(900) DEFAULT NULL, `order_no` varchar(96) DEFAULT NULL, `request_time` varchar(96) DEFAULT NULL, `code` varchar(96) DEFAULT NULL, `msg` varchar(96) DEFAULT NULL, `request_conetent` text, `request_response` text, `product_code` varchar(600) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ##SQL如下: select id from table_name where json_extract(`request_conetent`,'$.vclN')='xxxxx'; +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | xxxxxx | NULL | ALL | NULL | NULL | NULL | NULL | 85 | 100.00 | Using where | +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+
大家都知道MYSQL不支持函数索引,那如何优化呢?
MYSQL虽然不支持函数索引,但有一个替代方法:Generated Columns + index 代替函数索引
alter table table_name add column carno varchar(100) generated always as (json_extract(`request_conetent`,'$.vclN')) VIRTUAL,add key idx_carno(carno);
从执行计划里可以看出,已经走索引了
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29701030/viewspace-2646917/ ,如需转载,请注明出处,否则将追究法律责任。