首页 > 数据库 >[数据库] 使用索引(1): MySQL

[数据库] 使用索引(1): MySQL

时间:2024-02-24 14:11:08浏览次数:36  
标签:name 数据库 MySQL 主键 索引 year age 节点

索引 indexing

  • 索引是用来提高查询效率的, 会将数据按照被设为索引的字段进行排序, 这样根据该字段查找的时候更快
  • 数据库在没有索引的情况下, 默认进行全文搜索, 这意味着所有数据都会被遍历到
  • 索引和数据文件一样存储在磁盘上, 因此过多的索引会占用空间; 索引和数据文件的关联性也导致维护所需的资源增加

MySQL的索引

https://developer.aliyun.com/article/831250#slide-0

分类

主键索引

数据库自动建立的索引, 以数据表的主键primary key为主

唯一索引

create unique index age_index on user(age);
索引的值必须唯一, 可以是Null值

复合索引composite indexing

create index composite_index on user(name, birth_year, year);

最左前缀原则

多个字段联合组成的索引, 遵循最左前缀原则, 即查询语句中的筛选条件中, 索引的第一个key必须要有且在第一个⬇️
例如创建一个复合索引(name, birth_year, year)

-- 这些可查询, 注意name在最左边
select * from stu where name = ?;
select * from stu where name = ? and birth_year = ?;
select * from stu where name = ? and year = ?;
select * from stu where name = ? and birth_year = ? and year = ?;

同时mysql会自动变换顺序, 如果索引内的字段都被提到的话

-- 这一条也可查询, 注意三个字段都在
select * from stu where birth_year = ? and year = ? and name = ?;

如果顺序不正确或者该有的字段没有的话, 是不可用的

  • 全文索引, 空间索引, 前缀索引

存储方式

在mysql中, B+ tree被用来存储索引, 这是因为(1)不想二叉树一样一个节点只能分两个节点, (2) 数据都被存储在叶子节点中, 而这些节点之间由指针双向链接, 比B tree更适合快速查找
image

实例

这里用InnoDB引擎⬇️
首先创建一个表, 将id作为主索引, age作为一般(辅助)索引

CREATE TABLE 'user_innodb' (
  'id'       int(11) NOT NULL AUTO_INCREMENT,
  'username' varchar(20) DEFAULT NULL,
  'age'      int(11)     DEFAULT NULL,
  PRIMARY KEY ('id') USING BTREE,
  KEY 'idx_age' ('age') USING BTREE
) ENGINE = InnoDB;

主键索引的叶子节点存储数据, 普通节点(辅助节点)的叶子节点存储的是主键值
这是主键索引
image
这是(主键索引以外的)辅助索引
image
查询的流程都是一样的, 就是通过箭头一直向下查找到叶子节点, 找到对应的数据; 辅助索引需要额外先查找到对应的主键(即id)

这是复合索引, 假设现在有一个复合索引(a, b, c), 查找索引是会根据复合索引中字段的顺序来依次比较, 然后决定去往哪一个子节点, 和辅助索引一样, 叶子节点存储的是主键
image

标签:name,数据库,MySQL,主键,索引,year,age,节点
From: https://www.cnblogs.com/Akira300000/p/18022152

相关文章

  • ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
    1.问题在测试Windows上使用多版本Mysql数据库时,windows如何同时安装两个不同版本的Mysql(Mysql8.0+Mysql5.7)mysql-uroot-pn3fsco#ZdR7T在尝试使用DOS连接Mysql数据库发现问题2.原因我这里使用多版本Mysql数据库,该数据库在配置时,为了避免端口号与原数据库冲突,在my.ini中将......
  • windows如何同时安装两个不同版本的Mysql(Mysql8.0+Mysql5.7)
    1.问题由于公司要求使用mysql版本为Mysql5.7,而我之前的项目均是使用Mysql8.0,为了避免卸载重新安装Mysql5.7可能导致的问题,便寻找了可以同时在Windows上安装两个不同版本Mysql的方法2.解决参考:windows如何同时安装两个不同版本的Mysql(Mysql8.0+Mysql5.7)2.1进入你下载解压后......
  • MySQL——分组查询
    MySQL——分组查询在实际应用中,可能会有需要先进行分组,再对每一组的数据进行操作的需求吗,这个时候我们需要进行分组查询。分组语句结构:select分组函数(字段),参加分组的字段from表名groupby参加分组的字段;执行语句的顺序:from->where->groupby->select->orderby......
  • 数据库基础3 关系数据库与关系模型
    数据库系统的组成1.硬件平台2.软件3.人员(1)数据库管理员(DBA)(2)系统分析员、数据库设计人员(3)应用程序员(4)最终用户1.偶然用户2.简单用户3.复杂用户 关系数据库关系模型是从表(Table)的处理方式中抽象出来的在对传统表的操作上,进行数学化严格定义的基础上,......
  • 数据库基础2 数据模型
    数据模型数据模型是什么数据模型是对现实世界数据特征的抽象数据模型应该满足的要求数据模型分类1.现实→概念→逻辑→物理转换过程2.概念模型信息世界基本概念实体(Entity)属性码(键)实体型实体集 联系 ER图:实体-联系方法(待续)数据模型的组成要素1.数......
  • 数据库基础4 关系代数运算
    基本操作前提条件:并相容性是并、差、交等关系代数操作的前提参与运算的两个关系及其相关属性之间必须又一定的对应性、可比性或关联性两个关系的属性数量必须相同对于任意i,关系R的第i个属性必须与另一个关系的第i个属性的域相同(数据类型、取值范围)一、传统集合运算并......
  • 数据库基础5 关系演算
    “关系代数是基于集合的查询”“关系演算是基于逻辑的查询”他们共同构成了数据库结构化查询语言SQL的基础关系演算概述关系演算是以谓词演算为基础的 关系元组演算1.公式的递归构造sitar:比较运算(>、<、>=、<=、!=、==)只有这几条之内的,属于【公式】所有公式都是由......
  • 数据库基础6 SQL语言概述
    SQL语言引导词DDL:数据库定义语言DML:数据库操作语言DCL:数据库控制语言1.DDL语句引导词数据库定义语言用于各种对象的定义和删除,操作对象是表2.DML语句引导词数据库操作语言:增删改查,操作对象是记录3.DCL语句引导词数据库控制语言,操作对象是用户权限 常用数据库1.......
  • 数据库基础1 数据库系统概述
    1.1四个基本概念1.数据定义  2.数据库定义  3.数据库管理系统DBMS数据库管理系统是介于操作系统与用户之间的DBMS主要功能:  4.数据库系统定义与构成:在不引起歧义的情况下,将数据库系统简称为数据库 1.2数据管理技术的产生和发展什么是数据管......
  • 刘铁猛C#学习笔记11 索引器、常量
    一、索引器[]概述使一个对象可以像数组一样用方括号[]去访问其元素ex:字典的声明 1.索引器的声明首先像上文那样声明一个字典Dictionary<,>在VS中输入indexer,然后敲两下tab就能得到:(按下tab可以跳到下一个可编辑项上)第一个类型参数为返回值的类型,第二个类型参数为......