前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MYSQL 性能优化 index 函数,隐藏,前缀,hash 索引 使用方法(2)

MYSQL 性能优化 index 函数,隐藏,前缀,hash 索引 使用方法(2)

作者头像
AustinDatabases
发布于 2022-07-13 07:08:45
发布于 2022-07-13 07:08:45
5720
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

接着上期说,MYSQL 8 的索引的方式相对MYSQL 5.7 有了很多的进步,其中最突出的就是添加的functional indexes , 那么这个功能到底是什么时候开始的有的。

8.013 ,对MYSQL 8.013版本中开始添加了函数索引,下面我们举一个例子

create table function_test (id bigint primary key auto_increment, name varchar(20) not null, birth_day datetime);

mysql> insert into function_test (name,birrth_day) values ('Tim','2018-09-09'); Query OK, 1 row affected (0.01 sec) mysql> insert into function_test (name,birrth_day) values ('Sam','2020-01-09'); Query OK, 1 row affected (0.01 sec) mysql> insert into function_test (name,birrth_day) values ('Pam','2021-01-09'); Query OK, 1 row affected (0.00 sec) Alter table function_test add index month(birrth_day);

实际上我们得到了一个带有函数的索引 CREATE TABLE `function_test` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `birrth_day` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `month` (`birrth_day`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |

explain select birrth_day from function_test where month(birrth_day) = 5; explain select birrth_day from function_test where month(birrth_day) = 5;

基于这个功能,MYSQL的的版本应该是在8.013 版本以上。

而前缀索引是MYSQL独有的功能,但使用时有场景的,也就是首先添加前缀索引的额类型是字符类型,通过字段前部分的字段的值就可以明细查找数据,其主要的目的就是减少索引字节的同时,还能提高效率。

我们举例

create table prefix_test (id bigint primary key auto_increment,name varchar(20) not null, type_comments varchar(2000));

mysql> insert into prefix_test (name,type_comments) values ('Tim','1_我不喜欢'); Query OK, 1 row affected (0.01 sec) mysql> insert into prefix_test (name,type_comments) values ('Sam','3_我很喜欢'); Query OK, 1 row affected (0.01 sec) mysql> insert into prefix_test (name,type_comments) values ('Semon','2_没感觉'); Query OK, 1 row affected (0.00 sec) mysql> alter table prefix_test add index (type_comments(1)); Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0

explain select name from prefix_test where type_comments like '1%'; 通过上面的例子也可以看出,实际上我们只需要给2000 字符的,中的一个1个字符建立索引,就可以完成某些快速查找的完成。

或者可以通过这样的方式进行GROUP BY 等方式的数据组织等。

在这些过后就是MYSQL 的隐藏索引,这个并不是一个新的功能,在其他数据库也有类似的索引类型,实际上隐藏索引是针对某些查询来验证索引的有效性,并且让他上线或者下线的功能。

mysql> mysql> alter table prefix_test add index (type_comments(1)) invisible; Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table prefix_test; CREATE TABLE `prefix_test` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `type_comments` varchar(2000) DEFAULT NULL, PRIMARY KEY (`id`), KEY `type_comments` (`type_comments`(1)) /*!80000 INVISIBLE */ ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | mysql> explain select name from prefix_test where type_comments like '1%'; | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | | 1 | SIMPLE | prefix_test | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 33.33 | Using where | 1 row in set, 1 warning (0.00 sec) 上面的图中可以展示出虽然建立了新的索引但是invisible 的状态是无法使用的。如果要是要使用可以立即让他进入到 visible的状态。

最后是hash 索引,在上一篇中提到了自己建立了HASH 的方式解决等值索引中的多个字段建立联合索引,我们下面举一个例子来看看如何操作。

mysql> alter table hash_test add hash_col varchar(20) generated always as (crc32(concat(type1,type2))); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from hash_test; +----+------+-------+-------+------------+ | id | name | type1 | type2 | hash_col | +----+------+-------+-------+------------+ | 1 | Tim | 10 | 20 | 2249310613 | +----+------+-------+-------+------------+ 1 row in set (0.00 sec) mysql> insert into hash_test (name,type1,type2) values ('Sam','20','30'); Query OK, 1 row affected (0.00 sec) mysql> select * from hash_test; +----+------+-------+-------+------------+ | id | name | type1 | type2 | hash_col | +----+------+-------+-------+------------+ | 1 | Tim | 10 | 20 | 2249310613 | | 2 | Sam | 20 | 30 | 2378129210 | +----+------+-------+-------+------------+ 2 rows in set (0.00 sec)

下面我们就可以给hash 的虚拟字段建立索引

那么下次我们下次在查询的时候,就可以直接使用hash_col 来作为查找的索引字段,而不再关心ytype1 type2 如果有50个字段要建立索引,那么也可以不管,就一个字段可以表达N 个字段的值,这样查询速度快,同时你的索引任何时刻只有一个,空间效率的问题都解决了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL索引的一些小细
忙活了一天,晚上抽空做了几个关于索引和主键的小测试,记录一下,希望对大家有帮助。(所有测试都是在MySQL5.7的环境下测试的)
AsiaYe
2019/11/06
5360
再谈表的约束
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。 自增长的特点:
南桥
2024/08/15
580
再谈表的约束
MySQL索引优化与应用指南
索引类似于书本中的目录,它提供了一个数据项与实际数据存储位置之间的映射关系。通过索引,可以快速找到数据,而不需要遍历整个数据集。
用户11286421
2025/03/28
1400
MySQL索引优化与应用指南
MySQL数据库:内置函数
2.创建一个留言表,插入相关数据。①显示所有留言信息,发布日期只显示日期,不用显示时间②查询在2分钟内发布的帖子。
二肥是只大懒蓝猫
2023/10/13
2310
MySQL数据库:内置函数
Mysql介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。 MySQL使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。 提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。 MySQL 是开源的,所以不需要支付费用。 原生JSON支持(5.7 新增) 企业级的应用支持。
全栈程序员站长
2022/08/04
6070
Mysql介绍
第20期:索引设计(前缀索引)
这里主要介绍 MySQL 的前缀索引。从名字上来看,前缀索引就是指索引的前缀,当然这个索引的存储结构不能是 HASH,HASH 不支持前缀索引。
爱可生开源社区
2021/02/01
6570
MySQL 索引与性能调优
索引用于快速找出在某个列中有一特定值的行,如果不使用索引MySQL必须从第l条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,MySQL能快速到达某个位置去搜寻数据文件,而不必查看所有数据,可加快数据查询的查询速度提高效率,索引可在创建表时增加,也可动态调整已有表.
王瑞MVP
2022/12/28
2.3K0
MySQL 索引与性能调优
MySQL8.0新特性--函数索引
很多开发人员在使用MySQL时经常会在部分列上进行函数计算等,导致无法走索引,在数据量大的时候,查询效率低下。针对此种情况本文从MySQL5.7 及MySQL8.0中分别进行不同方式的优化。
俊才
2020/07/13
7450
MySQL基本操作
表是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录。表的操作 包括创建表、查看表、修改表和删除表。
星哥玩云
2022/08/18
2K0
MySQL基本操作
2.MySQL表操作
表就相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段
changxin7
2019/09/10
1.3K0
Mysql性能优化四:分库,分区,分表,你们如何做?
分库分区分表概念 分区 就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的 。 分表 就是把一张数据量很大的表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。表名可以按照某种业务hash进行映射。 分库 一旦分表,一个库中的表会越来越多。 下面来具体看看 分区 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三
友儿
2022/09/09
8860
MySQL之索引
#alter添加语法:alter table 表名 add primary key(列名)
老油条IT记
2020/03/22
6840
SpringBoot-14-MyBatis预热篇,MySQL小结
新建一个测试表:将sword_insert_test中test_name赋值为sword表中id大于5的name
张风捷特烈
2018/09/26
1.4K0
Mysql 基础篇
存储引擎是mysql的特性之一,使用者可以根据自己的业务场景选择自己适合的存储引擎,是不是要支持事物,如何选择存储,如何选择索引数据,当然你也可以定制自己的存储引擎,如果你们公司有能力,mysql支持支持很多种存储引擎,如 Myisam ,Innodb,MEMORY,MERGE,BDB,EXAMPLE,CSV等等,mysql 5.5之前默认的存储引擎是Myisam,之后就是Innodb,今天我们只讲常见的存储引擎。
小土豆Yuki
2020/06/15
7100
MySQL避免插入重复记录的方法
mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。 1、insert ignore 2、replace into 3、insert on duplicate key update
IT工作者
2022/01/26
2.3K0
Mysql系列 - 第4天:DDL常见操作汇总
DDL:Data Define Language数据定义语言,主要用来对数据库、表进行一些管理操作。
路人甲Java
2019/09/16
9880
MySQL 约束
  非空约束(NOT NULL)指字段的值不能为空。对于使用了非空约束的字段,用户在添加数据时没有指定值,数据库系统就会报错。可以通过 CREATE TABLE 或 ALTER TABLE 语句实现非空。在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空。
Demo_Null
2020/09/28
3K0
MySQL 约束
Mysql分库分表,你如何分,怎样分?
为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
友儿
2022/09/11
2.1K0
【MySql】表的约束
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束的本质是通过技术收到逼迫程序员插入正确的数据,反过来,站在mysql的视角,凡是插入进来的数据,都是符合数据约束的。约束的最终目标:保证数据的完整性和可预期性所以需要更多的约束。 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primarykey,auto_increment,unique key 。
平凡的人1
2023/10/15
2610
【MySql】表的约束
【Mysql】:linux环境下表的三部曲(数据操作 + 类型解析 + 约束规则)
这篇文章只是对以前的内容作个详细补充,想要速成操作的,可以参考这篇博客 【MySQL学习】:关系数据库标准语言SQL
IsLand1314
2025/02/09
450
【Mysql】:linux环境下表的三部曲(数据操作 + 类型解析 + 约束规则)
相关推荐
MySQL索引的一些小细
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文