mysql前缀索引使用
,不再需要回表查整行记录,减少语句的执行时间。索引字段的维护是有代价的,所以在建立冗余索引来支持覆盖索引时就需要权衡业务的需求,不能盲目来。1 前缀索引如果为每一种查询都设计一个索引,索引也就太多了,...
2024.11.13我们都知道where条件如果在字段上带了函数就不会去走索引,不好优化,无意间了解到mysql一个新特性--虚拟列,专门处理这块问题的,下面一起来了解下吧~
Generated Column在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默认的方式
语法 [ GENERATED ALWAYS ] AS ( ) [ VIRTUAL|STORED ][ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT ]应用场景假设有一个表,其中包含一个 date 类型的列 `SimpleDate` date
SimpleDate 是一个常用的查询字段,并需要对其执行日期函数,例如
select ... WHERE dayofweek(SimpleDate) = 3 ...此时的问题是 即使对 SimpleDate 建立索引,这个查询语句也无法使用,因为日期函数阻止了索引。
为了提高查询效率,通常要进行额外的操作,例如新建一个字段 SimpleDate_dayofweek,存放 dayofweek(SimpleDate) 的计算结果,然后对这列创建索引,SimpleDate_dayofweek 的值需要程序写入,例如使用触发器,在 SimpleDate 有变动时更新这样查询就可以改为
select ... WHERE SimpleDate_dayofweek = 3 ...这么做的好处是提高了查询性能,可以使用 SimpleDate_dayofweek 列的索引了,但又带来了其他麻烦,例如
降低了数据写入性能增加冗余数据,占用了更多的存储空间增加代码维护成本虚拟列 Generated Columns 就是用来解决这个问题的,可以增加一个可被索引的列,但实际上并不存在于数据表中,下面用一个实验来说明下:
实验需求:为了实现对json数据中部分数据的索引查询,考虑用MySQL5.7中的虚拟列功能
1、创建表
create table user(uid int auto_increment,data json,primary key(uid));2、准备数据
insert into user values (NULL,‘{"name":"hwb","address":"guangzhou"}‘);insert into user values (NULL,‘{"name":"tqy","address":"shenzhen"}‘);commit;3、构建姓名的虚拟列
alter table user add user_name varchar(20) generated always as (data->‘$.name‘);4、构建索引
alter table user add index idx_name(user_name);5、测试是否用到索引
explain select * from user where user_name=‘"hwb"‘ \G;可以看出用了索引了
6、插入新数据
此时的表的结构由于多出了user_name这一虚拟列,再插入别的数据要注意在表后指明插入列(不能给虚拟列插入数据)
insert into user(uid,data) values (NULL,‘{"name":"test","address":"shantou"}‘);做完发现这个实验好像不是那么好理解...应该对比一下加不加虚拟列有没走索引,可能会更容易让大家理解的...后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~
,不再需要回表查整行记录,减少语句的执行时间。索引字段的维护是有代价的,所以在建立冗余索引来支持覆盖索引时就需要权衡业务的需求,不能盲目来。1 前缀索引如果为每一种查询都设计一个索引,索引也就太多了,...
2024.11.13MySQL在很多情况下都会用到临时表,总结一下什么时候会用到临时表:什么是临时表:MySQL用于存储一些中间结果集的表,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。为什...
2024.11.13工作中会遇到网站访问提示mysql错误:Table XXX is marked as crashed and should be repaired。除了可以通过安装phpmyadmin进行修复,还可以...
2024.11.12函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 那么,函数到底在...
2024.11.14用户变量,可以定义在命令行、函数、存储过程中,断开连接时,变量消失,使用起来十分方便。用户变量的定义用户变量的定义,直接使用@标识符。下面的语句定义一个变量count,并进行赋值。set @count...
2024.11.11