MySQL数据库索引机制

news2025/1/10 11:00:31

文章目录

  • 一、MySQL缓冲区
  • 二、MySQL的page
    • 1.认识单个page
    • 2.认识多个页
    • 3.聚簇索引和非聚簇索引
  • 三、索引的操作
    • 1.创建主键索引
    • 2.创建唯一索引
    • 3.创建普通索引
    • 4.查询索引的方法
    • 5.删除索引的方法
    • 6.索引创建原则

一、MySQL缓冲区

MySQL是一款有客户端和服务端的网络应用,mysql是它的客户端,mysqld是它的服务端。服务端本质就是一个进程,它存在于内存当中。而我们存储在MySQL中的数据是保存在磁盘上的,当我们对MySQL中数据进行增删查改操作时,不可能是直接在磁盘上进行操作,而是将对应的数据加载到内存中,在内存中对数据进行操作,操作完毕之后再写回磁盘。

mysqld是MySQL的服务端,它存在于内存中,mysqld服务端启动起来以后会先向内存申请一段空间buffer pool,作为MySQL的数据缓冲区。MySQL是有着更高IO场景的应用软件,所以为了提高基本IO的效率,MySQL进行IO的基本单位是16KB。也就是说,磁盘这个硬件设备的基本单位是512字节,而MySQL InnoDB存储引擎使用16KB进行IO交互,即MySQL与磁盘进行数据交互的基本单位是16KB。这个基本数据单元,在MySQL这里叫做page(注意这里的page是MySQL的page,不是系统的page)。

当mysqld的buffer pool中充满大量page的时候,MySQL也要管理所有的page,管理的原则也是先描述再组织。MySQL会为每个page建立一个数据结构,该数据结构记录了每个page的详细信息,再通过特定的算法和数据结构将其组织起来。这里的组织方式就和MySQL的索引有关。

为什么MySQL和磁盘进行IO交互要采用page方案,而不是用多少加载多少呢?
如果我们向MySQL的一张表中插入五条数据,设其id值分别为1、2、3、4、5。如果MySQL要查找id=2的记录,第一次加载id=1,第二次加载id=2,一次一条记录,那么就需要2次IO。如果要找id=5的记录,那么就需要5次IO。但如果这五条数据一次性保存到MySQL的page中,只需要完成一次IO,下次再查询id=1、2、3、4、5时,完全不需要进行IO,直接是在内存中访问了,这样就会大大地减少了IO的次数。这种page方案其实是利用计算机的局部性原理实现的预加载策略。

二、MySQL的page

我们先来做一个实验,创建一张user表,表中将id设置为主键,它会默认生成主键索引。

create table if not exists user (
id int primary key,
age int not null,
name varchar(16) not null
);

然后我们向user表中依次插入以下数据,注意我们插入的时候id值是没有排序的,也就是乱序插入的。

mysql> insert into user (id, age, name) values(3, 18, '杨过');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user (id, age, name) values(4, 16, '小龙女');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (id, age, name) values(2, 26, '黄蓉');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (id, age, name) values(5, 36, '郭靖');
Query OK, 1 row affected (0.00 sec)

mysql> insert into user (id, age, name) values(1, 56, '欧阳锋');
Query OK, 1 row affected (0.01 sec)

但当我们查看表中数据的时候,我们会发现,表中的数据自动按照id升序排序了。这是MySQL帮我们做的主键排序。MySQL为什么要帮我们做排序呢?这就需要理解MySQL单个page的内部结构了。

在这里插入图片描述

1.认识单个page

MySQL中要管理很多数据表文件,而要管理好这些文件,就需要先描述再组织。我们以上面创建的user表为例子,假设user表中的数据加载到MySQL的page中,呈现出来的是下图的形式:

在这里插入图片描述

不同的page在MySQL中,都是16KB,并且使用page_prev和page_next构成双向链表。而单个page内部的数据记录之间,也是通过单链表连接的。因为创建user表时我们添加了主键,所以MySQL会默认按照主键给我们的数据进行排序。排序的目的是为了优化查询的效率。在单个page内部存放数据的模块,实质上也是一个链表的结构,链表的特点就是增和删特别快,查询和修改比较慢,所以必须要优化查询效率,数据有序了是非常方便查询的,查询快了,修改也就快了。

除此之外,单个page内部还会引入页目录,就像一本书的目录一样,通过目录可以快速定位每一章每一节的起始页码。例如下图的例子,引入页目录以后,如果我们要查找id=4的记录,原本要线性遍历,查找4个节点才能找到。现在可以直接从页目录2开始查找,只需要查找2个节点就可以找到,这也是提高了查询的效率。但这必须建立在page内部数据是有序的基础上,所以MySQL对表内数据按主键排序也是为了更好地引入页目录。

在这里插入图片描述

2.认识多个页

MySQL每个页大小只有16KB,单个page大小固定,所以随着数据量的不断增大,16KB的单页不可能存下所有的数据,那么必定会有多个页来存储数据。

在这里插入图片描述

单个页内部通过目录可以快速定位到需要查找的数据记录,但这仅局限于单页内查找数据,如果我们的MySQL表数据很大,分布在多个page中,不仅要对单个page内部进行查询,还要在page之间进行查询,如果page之间查询还是按照链式查询的话,那么查询的效率依旧是很低的。

所以为了解决这个问题,MySQL为多个page之间也引入了目录结构。它会让几个page不存放任何数据记录,单独存放page的目录。每个目录对应每个page的第一个数据记录的地址,这样在多page之间查找的效率就得到了提高。

在这里插入图片描述

但是又有一个问题,如果顶层的用于保存目录的page很多了,我们查找目录不也是需要线性遍历吗?这样不就还是会导致查找效率低吗?所以为了解决这个问题,我们可以再加目录页,在最顶层再加一个目录页,用来保存下一层目录的目录,说起来可能很绕,其实就是通过这个新加的目录页,可以快速定位下一层的目录页。

在这里插入图片描述

上图中的结构其实就是一棵B+树,它通过层层的目录页可以快速定位下一层需要查找的位置,所以查找效率比线性遍历快很多。因此,MySQL的索引本质就是一种利于查找的数据结构。所以我们user表中创建的主键,MySQL就自动帮我们建立了主键索引。如果一张表中没有主键,MySQL也会自动形成隐藏主键。

3.聚簇索引和非聚簇索引

聚簇索引指的是B+树的叶子节点是将索引和数据存放在一起的,而非聚簇索引指的是B+树的叶子节点没有将索引和数据存放在一起。

MySQL的InnoDB存储引擎就是聚簇索引,它将用户的数据和索引数据保存在一起。而MySQL的MyISAM存储引擎是非聚簇索引,它将索引数据和用户数据分离,也就是说B+树的叶子节点没有数据,只有对应数据的地址。

我们可以通过建表查看聚簇索引和非聚簇索引的表现。我们创建一张user1表使用InnoDB存储引擎,创建一张user2表使用MyISAM存储引擎,在Linux下的/var/lib/mysql路径下查看刚刚创建的两张表,我们会发现user1表对应的只有两个文件,user2表对应的却有三个文件。

其中user1和user2都有一个.frm文件,这个文件保存的是表的结构信息。但user1除此之外只有一个.ibd文件,这个文件保存的就是表的数据信息和索引信息。而user2除此之外有两个文件,分别是.MYD文件和.MYI文件,其中.MYD文件对应的是数据信息,.MYI文件对应的是索引信息。因此从这里就可以看出来,InnoDB是聚簇索引,MyISAM是非聚簇索引。

在这里插入图片描述

当然,MySQL除了默认会建立主键索引之外,我们用户也有可能建立按照其它列信息建立的索引,一般这种索引称为辅助索引或者普通索引。对于MyISAM存储引擎,建立辅助索引和主键索引没有区别,无非就是主键不能重复,而非主键可以重复。但是InnoDB存储引擎的辅助索引和主键索引却不一样,InnoDB的辅助索引中叶子节点并没有数据,而只有列数据对应记录的主键值,所以在查找数据的时候,通过辅助索引找到目标记录的主键值,然后用主键值在主键索引中检索获得记录,这个过程称为回表的过程。所以如果是通过辅助索引来查找数据,需要查找两遍索引。

三、索引的操作

1.创建主键索引

第一种方式:
在建表的时候,直接在字段后面指定primary key,即给某一字段添加主键。

mysql> create table user1(
    -> id int primary key,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> show index from user1\G
*************************** 1. row ***************************
        Table: user1
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.05 sec)

第二种方式:
在创建表的最后,指定某列或某几列为主键索引。

mysql> create table user2(
    -> id int,
    -> name varchar(20),
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> show index from user2\G
*************************** 1. row ***************************
        Table: user2
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

第三种方式:
创建表以后再添加主键索引。

mysql> create table user3(
    -> id int,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> alter table user3 add primary key(id);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from user3\G
*************************** 1. row ***************************
        Table: user3
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

主键索引的特点

  1. 一个表中,最多有一个主键索引,当然也可以使用复合主键。
  2. 主键索引的效率高,因为主键不可重复。
  3. 创建主键索引的列,它的值不能为null,且不能重复。
  4. 主键索引的列基本上是int。

2.创建唯一索引

第一种方式:
在表定义时,直接在某列后直接指定unique唯一属性。

mysql> create table user4(
    -> id int primary key,
    -> name varchar(20) unique
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> show index from user4\G
*************************** 1. row ***************************
        Table: user4
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user4
   Non_unique: 0
     Key_name: name
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

第二种方式:
创建表时,在表的后面指定某列或某几列为unique属性。

mysql> create table user5(
    -> id int primary key,
    -> name varchar(20),
    -> unique(name)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> show index from user5\G
*************************** 1. row ***************************
        Table: user5
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user5
   Non_unique: 0
     Key_name: name
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

第三种方式:
创建表之后再添加唯一索引。

mysql> create table user6(
    -> id int primary key,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> alter table user6 add unique(name);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from user6\G
*************************** 1. row ***************************
        Table: user6
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user6
   Non_unique: 0
     Key_name: name
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

唯一索引的特点

  1. 一个表中,可以有多个唯一索引。
  2. 唯一索引查询效率高。
  3. 如果在某一列上建立唯一索引,必须保证这列不能有重复数据。
  4. 如果一个唯一索引上指定not null,那么等价于主键索引。

3.创建普通索引

第一种方式:
在表定义的最后,指定某列为索引。

mysql> create table user7(
    -> id int primary key,
    -> name varchar(20),
    -> email varchar(20),
    -> index(name)
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> show index from user7\G
*************************** 1. row ***************************
        Table: user7
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user7
   Non_unique: 1
     Key_name: name
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

第二种方式:
在创建完表之后,指定某列为普通索引。

mysql> create table user8(
    -> id int primary key,
    -> name varchar(20),
    -> email varchar(20)
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> alter table user8 add index(name);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from user8\G
*************************** 1. row ***************************
        Table: user8
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user8
   Non_unique: 1
     Key_name: name
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

第三种方式:
在表创建完之后,再创建一个指定索引名的索引。这种方法不建议使用,建议直接就用列名做索引名,因为列名本身就具有唯一性,额外维护新的索引名代价比较大。

mysql> create table user9(
    -> id int primary key,
    -> name varchar(20),
    -> email varchar(20)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> create index name_index on user9(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from user9\G
*************************** 1. row ***************************
        Table: user9
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user9
   Non_unique: 1
     Key_name: name_index
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

普通索引的特点

  1. 一个表中可以有多个普通索引,普通索引在实际开发中用的比较多。
  2. 如果某列需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引。

4.查询索引的方法

第一种方法show keys from 表名

mysql> show keys from user9\G
*************************** 1. row ***************************
        Table: user9
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user9
   Non_unique: 1
     Key_name: name_index
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

第二种方法show index from 表名

mysql> show index from user9\G
*************************** 1. row ***************************
        Table: user9
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user9
   Non_unique: 1
     Key_name: name_index
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.01 sec)

第三种方法(信息比较简略)desc 表名

mysql> desc user9;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  | MUL | NULL    |       |
| email | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

5.删除索引的方法

  1. 删除主键索引:alter table 表名 drop primary key;
  2. 删除其它索引:alter table 表名 drop index 索引名,索引名就是show keys from 表名中的key_name字段。
  3. 使用drop删除:drop index 索引名 on 表名;

6.索引创建原则

  • 比较频繁作为查询条件的字段应该创建索引。
  • 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件。
  • 更新非常频繁的字段不适合创建索引。
  • 不会出现在where子句中的字段不该创建索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用CMD命令如何监听1433端口,windows下对端口的基本监听操作

使用CMD命令如何监听1433端口 开始---->运行---->cmd,或者是windowR组合键,调出命令窗口 netstat -ano |find "1433" 输入 netstat ;设定参数 -ano ;输入分隔符 | ;输入参数 find ;设定要监听的…

Zabbix监控系统及安装部署

Zabbix监控系统系统及安装部署 一、Zabbix的概念二、zabbix 监控原理三、zabbix的综合对比四、Zabbix 6.0 新特性Ⅰ、Zabbix server高可用防止硬件故障或计划维护期的停机:Ⅱ、Zabbix 6.0 LTS新增Kubernetes监控功能,可以在Kubernetes系统从多个维度采集…

走进人工智能|机器人技术 人机协作新纪元

前言: 机器人技术为人类提供协助、增强生产力,改善生活质量,并推动科技进步和社会发展。 文章目录 序言背景核心技术支持人机协作新纪元目前形式领跑人困难和挑战 总结 机器人技术作为现代科技领域的重要研究方向,已经在各个领域展…

电脑Tab键有什么功能?6个实用功能总结!

我最近对电脑的键盘很有兴趣,想了解一下各个键有什么特殊的用法。今天正好看到Tab键,想问下大家知道电脑的Tab键有什么比较好用的功能吗? 在电脑键盘上,Tab键是一个常见的键,它具有多种功能和用途。无论是在文本处理、…

BOSHIDA DC电源模块如何选择定制代加工

BOSHIDA DC电源模块如何选择定制代加工 选择定制代加工DC电源模块需要考虑以下几个方面: 1. 电源模块的性能和规格:需要根据实际应用场景,确定所需的输出电压、输出电流等参数,并选择合适的电源模块类型,如开关电源模…

神经网络的量化

tinyML 的主要挑战是如何采用相对较大的神经网络(有时约为数百兆字节),并使其适合并在资源受限的微控制器上运行,同时保持最小的功耗预算。 为此,最有效的技术称为量化(quantization)。 推荐&am…

1.5 为x64dbg编写插件

任何一个成熟的软件都会具有可扩展性,可扩展性是现代软件的一个重要特征,因为它使软件更易于维护和适应变化的需求,x64dbg也不例外其可通过开发插件的方式扩展其自身功能,x64dbg提供了多种插件接口,包括脚本插件、DLL插…

基于深度学习的高精度鸡蛋检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度鸡蛋检测识别系统可用于日常生活中或野外来检测与定位鸡蛋目标,利用深度学习算法可实现图片、视频、摄像头等方式的鸡蛋目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

水星U3相机在Halcon里面不能使用GenICamTL库采集解决方案

在halcon里面使用采集助手,U3相机不能使用GenICamTL库实时采集。 (首先确保已经安装好水星相机驱动,如果没有安装,GenICamTL库会找不到) 查看电脑的系统环境变量,打开对应电脑位数的值。 只留下大恒水星相…

ESP32(MicroPython) TFT LCD多功能显示(RTC+DHT22)

本程序内容与之前的类似,传感器换成DHT22,测量温湿度更符合日常使用的需要。逻辑上的一项改动是测量的温度和湿度值统一保留一位小数。 代码如下 from ili934xnew import ILI9341, color565 from machine import Pin, SPI import m5stack import tt14 …

【Redis】五大数据类型

🎯Redis 数据类型 💭Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sorted set有序集合)。 📝String(字符串) Redis的String类型是一种最基本的数据类型&…

基于OIDC的SSO单点登录

文章目录 什么是SSO(Single Sign On)单点登录OIDC(Open ID Connect)SSO服务授权流程(OIDC)授权模式授权码模式授权码模式授权流程请求授权码过程 授权模式对比总结 什么是SSO(Single Sign On&am…

Navicat 备份和恢复MongoDB库的数据

1、前期准备 (1) 有数据的MongoDB数据库old_db、空数据库new_db (2) 准备好MongoDB Tools 前往页面:https://www.mongodb.com/try/download/database-tools 选择所需版本下载并解压到自己想要的目录中: 2、将数据库old_db中的数据备份导出 (1) 对old_db…

多国卫星遥感领域工作人员和专家莅临大势智慧考察交流

7月4日下午,商务部卫星主题研修班(后简称“卫星研修班”)20余名来自多个国家的卫星遥感相关领域的工作人员和专家莅临武汉大势智慧有限公司(后简称“大势智慧”)参观考察、交流学习。大势智慧黄先锋博士陪同考察并作交…

学生用的台灯有什么讲究吗?盘点暑假适合写作业的台灯

如今青少年近视的比例越来越大,而且年龄越来越提前了,前不久经过一个小学看到二三年级就已经有孩子开始近视佩戴眼镜。其实造成近视的原因不全是读写作业时的坐姿不标准、学习时间过长、缺少户外的运动等,也包括可能灯光光源的问题造成对于视…

使用QTreeView显示指定目录中的文件,并自定义Header

这次研究了QTreeView的用法,于是想使用QTreeView显示制定目录下的所有子目录和文件。过程中,遇到了几个问题,在此记录一下同时分享给大家,如有不妥之处,还请批评指正: 设置根目录后,仍然会展示…

thinkphp系列vulhub所有漏洞复现ThinkPHP 2.x 任意代码执行漏洞,ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞

ThinkPHP 2.x 任意代码执行漏洞 漏洞详情: hinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由: $res preg_replace((\w).$depr.([^.$depr.\/])e, $var[\\\1\]"\\2";, implode($depr,$paths));导致用户的输入参数被插入双引号…

力扣 90. 子集 II

题目来源:https://leetcode.cn/problems/subsets-ii/description/ C题解1:由于解集不能包含重复的子集,所以我们先对nums进行排序, 以便后续去重。 采用递归回溯法,对每个子集都即使保存,在完成第一次子集…

一文晓得SaaS、IaaS和 PaaS 是什么,三者的区别是?

接下来我们直接直奔主题 首先,概念走起。 IaaS:基础设施服务, Infrastructure-as-a-service PaaS:平台服务,Platform-as-a-service SaaS:软件服务,Software-as-a-service IaaS 基础设施即服…

【C++】C++11的新特性

文章目录 1. C11简介2. 统一的列表初始化2.1 {}统一初始化2.2 std::initializer_list 3. 声明的新方式和范围for循环3.1 decltype3.2 auto&nullptr&范围for循环 4. STL的变化4.1 新容器4.2 新接口 1. C11简介 ​ 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1…