MySQL从入门到高级 --- 10.索引

第十章:

10.索引

  • 索引通过某种算法,构建出一个数据模型,用来快速查找在某个列中有一特定值的行,若表中查询的列有一个索引,MySQL能快速到达一个位置去搜索数据文件,而不必查看所有数据,将会节省很多时间
10.1 分类
  • Hash索引

  • B+Tree索引

Hash

在这里插入图片描述

B+Tree

在这里插入图片描述

功能划分

在这里插入图片描述

  • 单列索引:一个索引包含单个列,但一个表中可有多个单列索引

  • 普通索引:允许在定义索引的列中插入重复值和空值,没太多限制

10.2 创建索引
10.2.1 单列索引 - 普通索引

语法

-- 法1 创建表时直接指定
create database mydb12;
use mydb12;
create table stu(
    sid int primary key,
    name varchar(20),
    gender varchar(20),
    age int,
    score double,
    index index_name(name) -- name列创建索引
);

-- 法2 直接创建
-- create index indexname on tablename(columnname);
create index index_gender on stu(gender);

-- 法3 修改表结构
-- alter table tablename add index index_name(columnname);
alter table stu add index index_age(age);

在这里插入图片描述

10.2.2 查看索引

在这里插入图片描述
在这里插入图片描述

10.2.3 删除索引

语法

drop index 索引号 on 表名

alter table 表名 drop index 索引名

drop index index_gender on stu;
alter table stu drop index index_name;
10.2.4 单列索引 - 唯一索引
  • 索引列的值必须唯一,但允许有空值

语法

-- 法1 创建表时直接指定
create table stu2(
    sid int primary key,
    id varchar(20),
    name varchar(20),
    gender varchar(20),
    age int,
    score double,
    unique index_id(id) -- id列创建索引
);

-- 法2 直接创建
-- create unique index index_name on tablename(columnname);
create unique index index_gender on stu2(gender);

-- 法3 修改表结构
-- alter table tablename add unique index_name(columnname);
alter table stu2 add unique index_age(age);
10.2.5 单列索引 - 主键索引
  • 一种特殊的唯一索引,在创建表时,会自动在主键列上建立一个索引

在这里插入图片描述

10.2.6 组合索引
  • 也被称为复合索引,在建立索引时使用多个字段。使用复合最左原则

语法

create index indexname on table_name(column(length, column2(length));

create index index_age_score on stu2(age,score);

操作:

select * from stu2 where score = 88; -- 1
select * from stu2 where age = 20 ; -- 2
select * from stu2 where age = 20 and score = 88; -- 3
select * from stu2 where score = 88 and age = 20; -- 4
-- 2、3、4因为条件里必须包含索引前面的字段才能进行匹配,可用到索引index_age_score
-- 3、4相比where条件顺序不一样,在mysql中它们等价
10.3 全文索引
10.3.1 概述

关键字:fulltext

作用:查找文本中的关键字

使用like + %可实现模糊匹配,在大量数据里,全文索引比它快很多倍,不是一个量级,但全文索引精度可能存在问题

变量

  • 最小搜索长度

  • 最大搜索长度

搜索时,词语需在最小搜索长度和最大搜索长度的区间内

-- 查看这两个变量的默认值
show variables like '%ft%';
10.3.2 使用

关键字:match、against

语法:match(col1, col2, …) against(expr [search_modifier])

create table article(
    id int primary key auto_increment,
    title varchar(255),
    content varchar(999),
    writing date,
    fulltext(content) -- 创建全文索引
);

-- 添加全文索引
create fulltext index index_content on article(content);

-- 修改表结构添加全文索引
alter table article add fulltext index_content(content);
drop table article;
insert into article values(null,'zoo', 'yesterday one zoo animal hav dog and cat', '2004-01-26');
insert into article values(null,'food', 'you one food hav milk you you and bread', '2004-02-16');

insert into article values(null,"hair", "yesterday you one hair hav you short you",'2004-05-27');

select * from article where match(content) against('yo'); -- 无
select * from article where match(content) against('you'); -- 有 
select * from article where content like '%you%';
10.4 空间索引
  • 空间索引是对空间数据类型的字段建立的索引

  • 创建空间索引的列,必须将其声明NOT NULL

  • 使用SPATIAL关键字进行扩展,使能够用于创建正规索引类型的语法创建空间索引

数据类型

  • GEOMETRY

  • POINT

  • LINESTRING

  • POLYGON

10.4.1 操作

在这里插入图片描述
在这里插入图片描述

10.5 原理

索引本身很大,不可能全部存储在内存中,索引往往以索引文件的形式存储磁盘上。查找过程要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高很大,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

10.5.1 相关算法

Data Structure Visualization (usfca.edu)

Hash算法

在这里插入图片描述

  • 优点:通过字段值计算的hash值,定位数据快

  • 缺点:不能进行范围查找,散列表中的值是无序的,无法进行大小比较

二叉树

在这里插入图片描述

  • 特征:分为左子树、右子树和根节点,左子树比根节点值小,右子树比根节点值大

  • 缺点:有可能产生不平衡

平衡二叉树

在这里插入图片描述

特征

  • 左子树和右子树都是平衡二叉树

  • 左子树比中间值小, 右子树比中间值大

  • 左子树和右子树的深度之差的绝对值不超过1

缺点

  • 插入操作要旋转

  • 支持范围查询,但回旋查询效率较低

  • 树高度越高,查询效率会越慢

BTREE树
  • 目前大多数数据库系统及文件系统都采用B-Tree或B+Tree作为索引结构,Btree结构可有效解决之前相关算法所遇到的问题
B-Trees树

在这里插入图片描述

B+Trees树

在这里插入图片描述

10.6 MyISAM引擎使用B+Tree

在这里插入图片描述

10.7 InnoDB引擎使用B+Tree
  • 叶节点的data域存放数据,比MyISAM效率高一点,但比较占硬盘内存大小

在这里插入图片描述

10.8 索引特点

优点

  • 加快查询数据的速度

  • 显著减少查询时分组和排序的时间

  • 创建唯一索引,能保证数据库每一行数据的唯一

  • 实现数据的参考完整性方面,可加速表与表之间的连接

缺点

  • 随着数据量的增加,消耗时间也会增加

  • 需要占磁盘空间

  • 对数据表中数据进行增删改时,索引也要动态维护,降低了维护的速度

10.9 使用原则
  • 更新频繁的列不设索引

  • 数据量小的表不使用索引

  • 重复数据多的字段不设索引

  • 有限考虑对where和order by所涉及的列上建立索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值