MySQL8新特性之降序索引底层实现详解_Mysql

来源:脚本之家  责任编辑:小易  

导电率从小到大:锡铁铝金铜银 导电最强的是银。导电率是国际单位制中电阻率的倒数,表示物质导电的性能。I.A.C.S导电率百分值为I.A.C.S体积导电率百分值或I.A.C.S质量导电率百分值,其值为国际退火铜标准规定的电阻率(不管是体积和质量)对相同单位试样电阻率之比乘以100.如铜体积电阻率推导的导电率公式:(0.017241/P)*100,P电试复样体积电阻率。导电率定义或解释 电阻率的倒数为电导率。σ=1/ρ单位:在国际单位制中,电导率的单位是西制门子/米。说明电导率的物理意义是表示物质导电的性能。电导率越大则导电性能越强,反之越小。扩展资料物体传导电流的能力叫做导电性。各种金属的导电性各不相同,通常银的导电性最好,其次是铜和金。固体的导电是指固体中的电子或离子在电场作用下的远程迁移,通常以一种类型的电荷载体为主,如:电子导体,以电子载流子为zd主体的导电;离子导电,以离子载流子为主体的导电;混合型导体,其载流子电子和离子兼而有之。除此以外,有些电现象并不是由于载流子迁移所引起的,而是电场作用下诱发固体极化所引起的,例如介电现象和介电材料等。参考资料 百度百科导电性www.zgxue.com防采集请勿采集本网。

什么是降序索引

注意:此例MySQL的处理方式有些特别,连含Null值得记录也排除掉了,这与MSSQL的处理方式有点不一致。5)输出电话不为空的记录 select*from students where phone is not null;注意:此例只要不含Null值的

大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集。

主要有采用索引的方式,字段被定义为主键或unique会自动添加索引。以上表为例,可以添加age为索引;这样数据库就会开辟另一个空间对这个列进行排序。类似这样: name age 李四 80 张三 90 王五 100 这样的

我们通常使用下面的语句来创建一个索引:

如果不按升序,返回的结果多数情况下并不是自己需要的,这知是LOOKUP函数本身的特点,它还有一个特点是能够忽略错误值道,只要清楚它的特性,灵活运用,很多时候还是专需要用上LOOKUP函数的。不知现在遇到

create index idx_t1_bcd on t1(b,c,d);

特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个 mysqld 实例。一个实例管理器可以监视 mysqld 的各个实例。通过执行

上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引。

只要使用ORDER BY子句就可以按照升序或降序来排列结果: SELECT DISTINCT BRANCH_OFFICE FROM EMPLOYEES ORDER BY BRANCH_OFFICE ASC;这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH

但是大家不知道的是,上面这个sql实际上和下面的这个sql是等价的:

create index idx_t1_bcd on t1(b asc,c asc,d asc);

asc表示的是升序,使用这种语法创建出来的索引叫做升序索引。也就是我们平时在创建索引的时候,创建的都是升序索引。

可能你会想到,在创建的索引的时候,可以针对字段设置asc,那是不是也可以设置desc呢?

当然是可以的,比如下面三个语句:

create index idx_t1_bcd on t1(b desc,c desc,d desc);create index idx_t1_bcd on t1(b asc,c desc,d desc);create index idx_t1_bcd on t1(b asc,c asc,d desc);

这种语法在mysql中也是支持的,使用这种语法创建出来的索引就叫降序索引,关键问题是:在Mysql8.0之前仅仅只是语法层面的支持,底层并没有真正支持。

我们分别使用Mysql7、Mysql8两个版本来举例子说明一下:

在Mysql7、Mysql8中分别创建一个表,有a,b,c,d,e五个字段:

create table t1 (a int primary key,b int,c int,d int,e varchar(20)) engine=InnoDB;

然后分别创建一个降序索引:

create index idx_t1_bcd on t1(b desc,c desc,d desc);

创建成功后,我们使用以下sql查看一下索引信息:

show index from t1;

Mysql7中你将得到结果:

Mysql8中你将得到结果:

我们只关心Key_name为idx_t1_bcd的三行记录,细心的你应该可以发现,这两个结果中的Collation字段的结果是不一样的: 在Mysql7中,Collation字段的结果为A,A,A,表示b,c,d三个字段的排序方式是asc 在Mysql8中,Collation字段的结果为D,D,D,表示b,c,d三个字段的排序方式是desc

但是我们在创建索引的时候,明明在语法层面已经指定了b,c,d三个字段的排序方式是desc,这就可以看出来在Mysql7中降序索引只是语法层面的支持,底层并没有真正支持,并且固定是升序索引。而在Mysql8中则真正从底层支持了降序索引

到此为止,大家应该对升序索引和降序索引有了一个大概的了解,但并没有真正理解,因为大家并不知道升序索引与降序索引底层到底是如何实现的。

升序索引底层实现

我们知道,索引是用来提高查询速度的,但是为什么索引能提高查询速度呢?

给定你一个数列,比如[1,3,7,9,2,5,4,6,8],这是一个无序的数列或数组,现在如果想提高这个数列的查询速度,你首先会做什么? 我相信大部分人都能够想到先排序,先把这个无序的数列,按从小到大的顺序进行排序,比如得到[1,2,3,4,5,6,7,8,9],有了这个有序的数列之后,我们就可以利用比如二分法等等算法来提高这个数列的查询速度了。

我举这个例子想告诉大家的是:想提高数据集合的查询速度,首先你可以对这些数据进行排序。

所以,对Mysql表中的存储的数据也是一样的,我们如果想提高这个表的查询速度,我们可以先对这个表里的数据进行排序,那么表里的某一行数据包括了很多字段,我们现在想对这些数据行进行排序,我们应该根据哪些字段来确定这个顺序呢?这就是索引,在创建索引的时候你所指定的列就是用来对表里的数据行进行排序的。

比如我们仍然利用上面所创建的t1表,向t1表里插入8条数据:

insert into t1 values(4,3,1,1,'d');insert into t1 values(1,1,1,1,'a');insert into t1 values(8,8,8,8,'h');insert into t1 values(2,2,2,2,'b');insert into t1 values(5,2,3,5,'e');insert into t1 values(3,3,2,2,'c');insert into t1 values(7,4,5,5,'g');insert into t1 values(6,6,4,4,'f');

那么这些数据肯定是存储在文件中的,所以文件中保存这些数据的格式大概如下,顺序与插入顺序保持一致:

4311d

1111a

8888h

2222b

5235e

3322c

7455g

6644f

注意,t1是Innodb的存储引擎,而且a字段是主键,所以Innodb存储引擎在处理这些插入的数据时,会按主键进行排序,也就是上面我说的文件中保存这些数据的格式是不准确的,因为不想篇幅太长,所以不去深究,感兴趣的同学可以关注一波公众号:1点25,我会专门写一篇文章来讲解Innodb中索引的具体实现,包括B+树到底是如何生成的。

而如果我们基于上面的这种存储方式,来查找数据,比如查找a=3的这行记录,查找需要从第一行记录开始查找,那么要查找6次,而如果我们将上面的数据按照a字段的大小来进行排序:

1111a

2222b

3322c

4311d

5235e

6644f

7455g

8888h

排好序之后,如果我们还是查找a=3的这行记录,我们只需要查3次了。而且这样还有一个好处就是,如果我们现在需要查找a=3.5这行数据,如果我们基于未排序之前的存储方式,我们需要查询所有8行数据最终确定a=3.5这行数据不存在,而如果我们利用排好序之后的存储方式,我们就只需要查4次就好了,因为当你查到4311d这行记录时,你会发现4>3.5了,已经可以确定a=3.5的这行记录不存在了。

而如果我们现在对t1创建一个索引,就像上面创建索引一样,如果我们写的是下面的sql:

create index idx_t1_bcd on t1(b,c,d);

特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个 mysqld 实例。一个实例管理器可以监视 mysqld 的各个实例。通过执行

这个sql表示要对t1创建一个索引,索引字段是b,c,d,并且是升序的,所以实际上就是对原本的数据按照b,c,d三个字段进行排序,那么排序之后类似:

1111a

2222b

5235e

4311d

3322c

7455g

6644f

8888h

可以好好看下,上面的记录是按照b,c,d三个字段来对数据行就行排序的,比如1111a中的b,c,d三个字段的值是111,而2222b中的b,c,d三个字段的值是222, 111是小于222的,所以对应的行排在前面。

那么数据如果这样排序有什么好处呢?其实和刚刚按a字段排序之后的好处是类似的,比如你现在想来查找b=4 and c=4 and d=4的数据也是能查询更快的,实际上这就是索引的原理: 我们对某个表创建一个索引,就是对这个表中的数据进行排序,而排好序之后的数据是能够提高查询速度。

还有一点需要注意的是,排序有很多中方式,或者所可以利用一些数据结构,比如二叉树、红黑树、B+树,这些数据结构实际上就是对数据进行排序,只是排序的形式各不相同而已,每种数据结构有它各自的特点,而大家应该都知道,Mysql中用得最多的就是B+树了。

相信,看到这里,大家应该对索引重新有了认识,只不过我们上面举的几个例子都是升序排序,而且排好序之后的数据不仅可以提高查询速度,而且对于order by也是管用的,比如我们如果现在想对t1进行order by b asc,c asc,d asc;对于这个排序,如果已经在t1表建立了b,c,d的升序索引,那么就代表对t1表中的数据已经提前按照b,c,d排好序了,所以对于order by语句可以直接使用已经排好序的数据了,不用利用filesort再次进行排序了。

而且如果我们的order by是order by b desc, c desc, d desc,同样可以利用b,c,d的升序索引,因为如果是order by b asc,c asc,d asc就从上往下遍历即可,如果是order by b desc, c desc, d desc就从下往上遍历即可。

那么,如果是order by b asc, c desc, d desc呢?这个order by是不是就没有办法利用b,c,d的升序索引了。

这个时候就需要降序索引了。

降序索引底层实现

我们花了较大篇幅介绍了升序索引的实现原理,总结来说就是对表中的数据按照指定的字段比较大小进行升序排序。

升序是什么?是数据进行大小比较后,是小的在上,大的在下,或者如果是B+树的话就是小的在左,大的在右。而降序就是大的在上,小的在下,或者如果是B+树的话就是大的在左,小的在右。

所以,对于上面的那份原始数据:

4311d

1111a

8888h

2222b

5235e

3322c

7455g

6644f

如果我们将这份数据按照a desc进行排序就是:

8888h

7455g

6644f

5235e

4311d

3322c

2222b

1111a

非常简单吧,那如果我们将这份数据按照b desc, c desc, d desc排序就是:

8888h

6644f

7455g

3322c

4311d

5235e

2222b

1111a

也非常简单,那如果我们要将这份数据按照b desc, c asc, d desc排序呢?这是不是就有点懵了?

其实不难,排序其实就是对数据比较大小,我们用下面三行数据来模拟一下:

3322c

7455g

4311d

首先,按照b desc, c desc, d desc来排序,得到结果如下:

7455g

3322c

4311d

按照b desc, c asc, d desc来排序,得到结果如下:

7455g

4311d

3322c

可能一部分大佬已经能理解,实际上b desc所表达的意思就是b字段数据大者在上,数据小者在下,数据相等的话则开始比较c字段,而c字段是按升序排的,也就是c字段数据小者在下,数据大者在上。所以就得到了上面的结果。

这就是降序索引。

总结

实际上升序索引和降序索引是不同的排序方式而已,Mysql8中正在实现了降序索引后,我们在创建索引时更加灵活,可以根据业务需要的排序规则来创建合适的索引,这样能使你的查询更快。

当然本文只讲了原理,大家一定要知道Mysql中排序利用的B+树,而不是上面我举例的那种很简单的方式,但是就算用B+树原理也是一样的,比较数据的大小而已。

还有一点,现在只有Innodb存储引擎支持降序索引

到此这篇关于MySQL8新特性之降序索引底层实现详解的文章就介绍到这了,更多相关MySQL8 降序索引内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

工具:mysql数据库创建一个user的表里边的字段1.普通索引 添加INDEXALTER TABLE `table_name` ADD INDEX index_name(`column`)下面演示下给user表的name字段添加一个索引2.主键索引 添加PRIMARY KEYALTER TABLE `table_name` ADD PRIMARY KEY(`column`)3.唯一索引 添加UNIQUEALTER TABLE `table_name` ADD UNIQUE(`column`)4.全文索引 添加FULLTEXTALTER TABLE `table_name` ADD FULLTEXT(`column`)5.如何添加多列索引ALTER TABLE `table_name` ADD INDEX index_name(`column1`,`column2`,`column3`)内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • mysql8新特性:降序索引详解
  • 推荐没有虚拟主机的小巧的mysql数据库备份脚本(php)
  • mysql error code : 1436 thread stack overrun
  • 配置mysql主从服务实现实例
  • window10下mysql 5.7.21 安装配置方法图文教程
  • 如何使用索引提高查询速度
  • 浅析mysql join语法以及性能优化
  • mysql外键使用及说明详解
  • mysql去重的两种方法详解及实例代码
  • 超简单的qps统计方法(推荐)
  • mysql用作备份还原的导入和导出命令用法整理
  • mysql怎么添加索引sql语句
  • 求金属的导电性能排名, 降序的.
  • rank函数降序排名怎么操作?
  • 查询各课程的平均成绩并按成绩降序排列
  • MySQL 中NULL和空值的区别
  • SQL语句中全表扫描是什么意思,如何让SQL语句不进行全表扫描
  • lookup函数。 使用条件太苛刻了吧! 一定要是降序吗?
  • postgresql 连接池一般为多大
  • DB2和其他数据库在一些SQL语法上的区别?
  • 求助C#net招聘笔试题目
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mysqlmysql8新特性:降序索引详解推荐没有虚拟主机的小巧的mysql数据库备份脚本(php)mysql error code : 1436 thread stack overrun配置mysql主从服务实现实例window10下mysql 5.7.21 安装配置方法图文教程如何使用索引提高查询速度浅析mysql join语法以及性能优化mysql外键使用及说明详解mysql去重的两种方法详解及实例代码超简单的qps统计方法(推荐)mysql用作备份还原的导入和导出命令用法整理mysql安装图解 mysql图文安装教程can""""t connect to mysql servwindows下mysql5.6版本安装及配置mysql字符串截取函数substring的mysql创建用户与授权方法mysql提示:the server quit withmysql——修改root密码的4种方法mysql日期数据类型、时间类型使用mysql update语句的用法详解mysql 的case when 语句使用说明mysql向mariadb平滑过渡的步骤详解mysql导入导出数据中文乱码解决方法小结mysql 备份还原数据库批处理mysql备份原理详解linux下mysql5.6 二进制安装过程mysql 5.7.18 release版安装指南(含有bi如何将mysql存储位置迁移到一块新的磁盘上使用mysql事件调度器定时删除binlog详解mysql插入和查询数据的相关命令及语句linux下卸载mysql数据库
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved