我们都知道where条件如果在字段上带了函数就不会去走索引,不好优化,无意间了解到mysql一个新特性--虚拟列,专门处理这块问题的,下面一起来了解下吧~
在MySQL 5.7中,支持两种Generated Column,即 Virtual Generated Column和Stored Generated Column ,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将Generated Column持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与Virtual Column相比并没有优势,因此,MySQL 5.7中,不指定Generated Column的类型,默认是Virtual Column。
如果需要Stored Generated Golumn的话,可能在Virtual Generated Column上建立索引更加合适。综上,一般情况下,都使用Virtual Generated Column,这也是MySQL默认的方式
假设有一个表,其中包含一个 date 类型的列 `SimpleDate` date
SimpleDate 是一个常用的查询字段,并需要对其执行日期函数,例如
此时的问题是 即使对 SimpleDate 建立索引,这个查询语句也无法使用,因为日期函数阻止了索引。
为了提高查询效率,通常要进行额外的 *** 作,例如新建一个字段 SimpleDate_dayofweek,存放 dayofweek(SimpleDate) 的计算结果,然后对这列创建索引,SimpleDate_dayofweek 的值需要程序写入,例如使用触发器,在 SimpleDate 有变动时更新这样查询就可以改为
这么做的好处是提高了查询性能,可以使用 SimpleDate_dayofweek 列的索引了,但又带来了其他麻烦,例如
虚拟列 Generated Columns 就是用来解决这个问题的,可以增加一个可被索引的列,但实际上并不存在于数据表中,下面用一个实验来说明下:
需求:为了实现对json数据中部分数据的索引查询,考虑用MySQL5.7中的虚拟列功能
1、创建表
2、准备数据
3、构建姓名的虚拟列
4、构建索引
5、测试是否用到索引
可以看出用了索引了
6、插入新数据
此时的表的结构由于多出了user_name这一虚拟列,再插入别的数据要注意在表后指明插入列(不能给虚拟列插入数据)
做完发现这个实验好像不是那么好理解...应该对比一下加不加虚拟列有没走索引,可能会更容易让大家理解的...后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~
下面列出:
1.增加一个字段
alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL//增加一个字段,默认为空
alter table user add COLUMN new2 VARCHAR(20) NOT NULL //增加一个字段,默认不能为空
2.删除一个字段
alter table user DROP COLUMN new2 //删除一个字段
3.修改一个字段
alter table user MODIFY new1 VARCHAR(10) //修改一个字段的类型
alter table user CHANGE new1 new4 int //修改一个字段的名称,此时一定要重新
//主键
alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id)
//增加一个新列
alter table t2 add d timestamp
alter table infos add ex tinyint not null default ‘0′
//删除列
alter table t2 drop column c
//重命名列
alter table t1 change a b integer
//改变列的类型
alter table t1 change b b bigint not null
alter table infos change list list tinyint not null default ‘0′
//重命名表
alter table t1 rename t2
加索引
mysql>alter table tablename change depno depno int(5) not null
mysql>alter table tablename add index 索引名 (字段名1[,字段名2 …])
mysql>alter table tablename add index emp_name (name)
加主关键字的索引
mysql>alter table tablename add primary key(id)
加唯一限制条件的索引
mysql>alter table tablename add unique emp_name2(cardnumber)
删除某个索引
mysql>alter table tablename drop index emp_name
增加字段:
mysql>ALTER TABLE table_name ADD field_name field_type
修改原字段名称及类型:
mysql>ALTER TABLE table_name CHANGE old_field_name new_field_name field_type
删除字段:
mysql>ALTER TABLE table_name DROP field_name
mysql修改字段长度
alter table 表名 modify column 字段名 类型
例如
数据库中user表 name字段是varchar(30)
可以用
alter table user modify column name varchar(50)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)