mysql按主键排序为什么比索引快

mysql按主键排序为什么比索引快,第1张

MYSQL官方文档介绍索引是一种方便快速查询数据的数据结构。用我们生活中的例子来讲,索引就好比书的目录,如果没有目录,每次你想要查找某些内容,你必须从头开始查找,这样的效率极其低下。

索引一般比较大,所以大部分情况下索引是存在磁盘的索引文件上,也有可能是存在数据文件上。

索引的种类有很多:主键索引(这是最常见的一种索引,主键不能为空且必须唯一)、唯一索引(相对于主键索引,它的值可以为空)、全文索引(在char、varchar、text类型可以使用)、普通索引、前缀索引。按照列数来区分:单一索引、组合索引(多字段组成)

2.MYSQL索引的数据结构

在讲解MYSQL索引的数据结构之前,我们先看看了解一下其他的数据结构,看看他们的优缺点进行对比。

2.1 二叉树

二叉树简单来说就是左节点大于右节点,在理想的情况下,他的查找速度就接近与二分法的性能O(log2n)。因为在内存排序的时间是非常快的,可以忽略不计,所以总的消耗时间就取决于IO的 *** 作次数。二叉树查找速度取决树高,每次查询接口都是一次IO *** 作,也是性能的瓶颈所在。

但是也会有这种一种情况,同样也是二叉树,但是他的树非常高,导致查询一次需要多次IO *** 作,效率及其低下

2.2 平衡二叉树

平衡二叉树可以解决二叉树不稳定导致查询效率低下的缺点。平衡二叉树的特点:树的左右节点层级最高相差一层。在插入或者删除的情况下,通过左旋转或右旋转使得整个二叉树平衡,不会出现层级相差很多的情况。平衡二叉树的性能接近二分法查找O(log2n)。

平衡二叉树查找id为8的记录,只需要IO *** 作2次即可。但是仔细想一下,如果数据量很多呢?假设数据表有100W的数据,根据O(log2n)计算,大约需要20次IO *** 作。磁盘寻道大概需要10ms,总的查询时间为20 * 10 = 0.2,效率也比较低下。

还有就是平衡二叉树不支持范围查询,范围查询每次都需要从根节点遍历,效率及其低下。

2.3 B-树(改造二叉树成多叉树)

之前的几种树形结构适合与小数据量的内存查找,也叫做内查找。在1970年,R.Bayer和E.Mccreight提出了一种适合于外查找的平衡多叉树B-树。MYSQL数据文件是存在磁盘的,每次都是按照一页大小(一般而16K)读取内存。像二叉树、平衡二叉树,每次读取节点都要进行一次IO *** 作,所以树越高IO *** 作次数越多。想要提高

select * from tab order by date DESC,table_id DESC。

在数据库中,输入这些就可以按时间排序。

MySQL 是一个关系型数据库,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策(本词条"授权政策"),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP ,Linux和 Apache 可组成良好的开发环境,经过多年的web技术发展,在业内被广泛使用的一种web服务器解决方案之一,称之为LAMP。

1).

对mysql,

innodb,

你的第一条sql

DESC

SELECT

*

FROM

`user`

ORDER

BY

id

DESC

一定会显示使用了主键索引.

因为innodb是index

clustered

table,

数据项在主键索引的叶节点上.

所以肯定可以用主键排序.

2).

innodb的二级索引

存的是

当前column+对应的主键,

查询时用

主键值去

主键索引中查询相对应的row.

In

InnoDB,

each

record

in

a

secondary

index

contains

the

primary

key

columns

for

the

row,

as

well

as

the

columns

specified

for

the

secondary

index.

InnoDB

uses

this

primary

key

value

to

search

for

the

row

in

the

clustered

index.

DESC

SELECT

*

FROM

`user`

ORDER

BY

num

DESC

这条语句如果用num上的索引来排序,

按num索引的顺序

去主键索引查,

极端情况下就是40000次随机查询.

反而不如做filesort来的快.

3).

SELECT

*

FROM

`user`

WHERE

num

=

23

ORDER

BY

num

DESC

这条和:

SELECT

*

FROM

`user`

WHERE

num

=

23

有差别么?

直接

索引找到num=23

的列就完了.

如果结果集较小,

比如:

SELECT

*

FROM

`user`

WHERE

num

between

23

and

30

ORDER

BY

num

DESC

则可能会是用num上的索引排序.


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5906702.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-07
下一篇2023-03-07

发表评论

登录后才能评论

评论列表(0条)

    保存