mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟列及json字段类型

一、先创建一个测试表:

drop table if exists t_people;

CREATE TABLE t_people(

`id` INT(11) NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL DEFAULT '',

`profile` json not null ,

`created_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),

`updated_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),

PRIMARY KEY (id));

注:这里profile是一个json类型的字段,另db编码采用utf8mb4

二、生成测试数据

delimiter //

-- 写一段存储过程,方便后面生成测试数据

create procedure batchInsert()

begin

declare i int;

declare v_name varchar(50);

declare v_profile varchar(100);

set i=0;

while i<100000 do

set v_name = concat(substring('赵钱孙李周吴郑王张杨',floor(1+(rand()*10)),1),substring('菩提树下的杨过',floor(1+(rand()*7)),1),substring('我爱北京天安门',floor(1+(rand()*7)),1),i);

set v_profile = concat("{\"phone\":\"",concat('13',floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9)),floor(1+(rand()*9))) , "\",\"age\":",i,"}");

insert into t_people(`name`,profile) values(v_name,v_profile);

set i=i+1;

end while;

end; //

注:这段存储过程不是本文重点,看不懂的同学不用深研,大概意思就是name随机生成,profile随机生成一个类似{"phone":"13xxxxxx","age":x}的内容。

调用一下这个存储过程,生成100000条测试数据,数据大致长下面这样:

需求来了,假如我们要查姓“张”的人有多少个?

这显然是一个全表扫描!

三、前缀索引

肯定有同学想到了,在name上建一个前缀索引,只对name的第1个字做索引

alter table t_people add key ix_name(name(1));

确实是个好办法,效果也不错

但是需求总是变化的,如果想查第2个字是“杨”的人有多少?

依然会全表扫描。

四、虚拟列

alter table t_people add second_name varchar(3) generated always as(substring(name,2,1)) stored;

创建了一个虚拟列second_name,其值是substring(name,2,1),即name中的第2个字,最后的stored表示,数据写入时这个列的值就会计算(详情可参考最后的参考链接)

注:虚拟列并不是真正的列,insert时也无法指定字段值。

然后在这个列上创建索引:

alter table t_people add index ix_second_name(`second_name`);

再来看下执行计划,索引生效了,扫描行数也明显下降。

当然,sql语句也可以改成:

explain select count(0) from t_people where second_name='杨';

这样看上去更直观,效果不变。

五、json检索

又来新需求了:要查profile中手机号为13589135467,并且姓“吴”的人

注意:profile->"$.phone"=xxx 就是json字段的检索语法

分析执行计划,可以看到前缀索引“ix_name”生效了,但还有优化空间,仍然可以借助虚拟列,创建2个虚拟列phone、first_name,并创建联合索引。

alter table t_people add first_name varchar(3) generated always as(substring(name,1,1)) stored;

alter table t_people add phone varchar(20) generated always as(profile->"$.phone") stored;

alter table t_people add index ix_phone_firstname(phone,first_name);

加了这2个虚拟列后,数据长这样:

注:phone列提取出来后,前后会带上引号。

刚才的需求,可以改写sql:

select * from t_people where phone='\"13589135467\"' and name like '吴%';

最后看下执行计划:

扫描行数下降到个位数,效果十分明显。

参考文章:

mysql修改虚拟列属性失败_mysql虚拟列(Generated Columns)及JSON字段类型的使用相关推荐

  1. mysql虚拟列(Generated Columns)及JSON字段类型的使用

    mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟列及json字段类型 一.先创建一个测试表: 1 2 3 4 5 6 7 8 9 drop table  if ex ...

  2. docker容器mysql修改密码后重启失败

    解决docker容器中mysql修改密码后重启失败 前言 本文内容:1如何修改mysql密码,本地mysql也可以这么修改:2修改mysql容器的环境变量(其他容器同理)3结束语 在docker运行中 ...

  3. mysql+json+ciud_mysql 5.7 json 字段类型查找、修改

    修改 json 里的数组字段 mysql> set @json = '{"test": [{"name": "laravel"}, { ...

  4. mysql 修改列名和属性_mysql增加列修改列名列属性以及删除列

    首先推荐一本初学者的书,一个小册子:<mysql必知必会>简介实用,权威:有点贵,昨天才买的. http://www.2cto.com/ebook/201112/30389.html 正文 ...

  5. mysql修改主键属性_mysql如何改变主键属性

    mysql改变主键属性的方法:1.使用关键字modify,代码为[alter table tbl_name modify.....]:2.使用关键字change,代码为[alter table tbl ...

  6. mysql 修改库的校对集_mysql数据库的基本操作(增删改查、字符集、校对集)

    MySQL数据库概述 MySQL数据库是经典的关系型数据库管理系统,MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Dat ...

  7. HTML5column属性布局页脚,利用column多列属性调整页面文字列布局

    column多列属性 column-count:栏目数 兼容性写法: CSS Code复制内容到剪贴板 -webkit-column-count:3 -moz-column-count:3 colum ...

  8. thinkphp mysql json数据类型_ThinkPHP:JSON字段类型的使用(ORM)

    ThinkPHP5.1版本正式发布已经有一段时间了,我会陆续给大家介绍其中的新特性.今天要给大家介绍的是一个可能很多用户还不了解的一个特性:JSON字段数据支持.不过首先注意一点,本篇内容中描述的JS ...

  9. mysql修改存储引擎报错_MySQL查看修改存储引擎总结

    本文总结了MySQL下查看.修改存储引擎的一些方法.测试.验证环境为MySQL 5.6 ,如有差异,请以实际版本为准 1:查看MySQL的存储引擎信息 1.1 使用show engines命令. Su ...

最新文章

  1. CentOS 编译 openjdk
  2. Android实现点击事件的4种方式
  3. pageX/Y, offset(), position(), scrollTop(), screenX/Y, clientX/Y, pageX/Y
  4. 解决网络通信中外网和内网之间的通信问题(NAT转换)
  5. 工业以太网在工业领域的应用特点详解
  6. LoadRunner
  7. 惠普g260鼠标宏软件_黑爵电竞鼠标AJ337 电竞手残党福音 鼠标宏一键火力全开
  8. 支付宝 报错 rsa_private read error : private key is NULL解决方法
  9. 分享WordPress博客搜索引擎优化的六点经验 博客园 cnbogs
  10. 7-5 输出字符串中出现的字符 (20 分)
  11. Nancy之静态文件处理
  12. C++包含头文件尖括号和双引号的区别
  13. 短信平台接口怎么选择?看这一篇就够了
  14. 2021年,到底该不该去培训机构!<仅供参考,因人而异!>
  15. 谷歌、华盛顿大学联合研究:为什么在标准数据集上刷榜有问题
  16. IntelliJ Idea设置护眼浅绿色背景方法
  17. 赵鑫:强化学习在京东广告序列推荐中的应用
  18. log文件过大处理方法
  19. 兼容ie8及其以上IE浏览器,360浏览器,QQ浏览器等双核浏览器。
  20. 2011届移动开发者大会

热门文章

  1. 计算机视觉招聘_香港理工大学人工智能设计实验室科研招聘
  2. kubectl 创建pvc_动态挂载云盘(PVC)
  3. python3精要(34)-import工作原理
  4. 【深度学习】深度学习预测房价:回归问题,K折交叉
  5. 【学术相关】毕业答辩老师必问问题,并附上常见的应对话术包装
  6. 【科普】让人头秃的理论:什么是“奥卡姆剃刀”原理?
  7. 一文深入浅出cv中的Attention机制
  8. 技术圈鄙视链形成的真实原因?
  9. EMNLP 2019中和BERT相关的一些论文介绍
  10. 低延时直播与RTC融合架构设计③:RTC融合架构设计