文章目录
MYSQL的索引和存储引擎
介绍
索引是通过某种算法,构建出一个数据模型,用于快速查出在某个列中有一特定值的行,不使用索引,MYSQL必须从第一行记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MYSQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间.
索引类似一本书的目录,比如要查找student这个单词,可以先找到s开头的页然后向后查找,这个就类似索引.
索引的分类
索引是存储引擎用来快速查找记录的一种数据结构.
按照数据结构分:
① Hash索引
② B+Tree索引
按照功能分:
① 单列索引
普通索引
唯一索引
主键索引
② 组合索引
③ 全文索引
④ 空间索引
单列索引-普通索引
单列索引: 一个索引只包含单个列,但一个表中可以有多个单列索引
普通索引: MYSQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹是为了查数据更快一点.
创建普通索引:
方式1-创建表的时候直接创建索引
create table student(
sid int primary key,
car_id varchar(20),
name varchar(20),
index index_name(name) -- 给name列创建索引
);
方式2-直接创建
create index index_name on student(name);
方式3-通过修改表结构添加索引
alert table student add index index_name(name);
查看索引:
查看数据库所有的索引
select * from mysql.innodb_index_stats a where a.database_name='数据库名';
查看表中的所有索引
show index from student;
删除索引
drop index 索引名 on 表名;
alert table 表名 drop index 索引名;
单列索引-唯一索引
唯一索引与前面的普通索引类似,不同的就是,索引列的值必须唯一,但允许为空,如果是组合索引,则列值组合必须唯一.
创建普通索引:
方式1-创建表的时候直接创建索引
create table student(
sid int primary key,
car_id varchar(20),
name varchar(20),
unique index_car_id(car_id) -- 给 car_id 列创建索引
);
方式2-直接创建
create unique index index_car_id on student(car_id);
方式3-通过修改表结构添加索引
alert table student add unique index_car_id(car_id);
删除索引
drop index 索引名 on 表名;
alert table 表名 drop index 索引名;
单列索引-主键索引
每张表一般都会有自己的主键,当我们在创建表时,mysql会自动在主键列上建立一个索引,这就是主键索引,主键是具有唯一性并且不允许为NULL,所以她是一种特殊的唯一索引.
组合索引
组合索引也叫复合索引,指的是我们在建立索引的时候使用多个字段,列入同时使用身份证和手机号建立索引,同样的可以建立为普通索引或者唯一索引.
复合索引的使用复合最左原则.
创建索引:
create index index_phone_car_id on student(phone,car_id); -- 普通的组合索引
create unique index index_phone_car_id on student(phone,car_id); -- 唯一的组合索引
删除索引
drop index 索引名 on 表名;
alert table 表名 drop index 索引名;
eg:
① select * from student where car_id='130825';
② select * from student where phone='1523151';
③ select * from student where phone='1523151' and car_id='130825';
④ select * from student where car_id='130825' and phone='1523151';
四条sql只有②、③、④能使用到索引index_phone_car_id,因为条件里面必须包含索引前面的字段,才能够进行匹配;
而③、④相比where条件的顺序不一样,为什么④可以用到索引呢?因为mysql本身就是一层sql优化,他会根据sql来识别出该用哪个索引,我们可以理解为③、④在mysql眼中是等价的.
全文索引
全文索引的关键字是fulltext
全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,它更像是一个搜索引擎,基于相似度的查询,而不是简单的where语句的参数匹配.
用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少是合适的,但是对于大量的文本数据检索,是不可想象的,全文索引在大量的数据面前,能比like + %快N倍,速度不是一个数量级的,但是全文索引可能存在精度问题.
-- 修改表结构添加全文索引
alter table 表名 add fulltext 索引名(列名)
-- 添加全文索引
create fulltext index 索引名 on 表名(列名)
-- 使用全文索引
select * from 表名 where match(列名) against('yo');
空间索引
mysql在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型
空间索引是对空间数据类型的字段建立的索引,mysql中的空间数据类型有四种,分别是GEOMETRY,POINT,LINESTRING,POLYGON
MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引
创建空间索引的列,必须将其声明为NOT NULL
空间索引一般是用的比较少.
类型
含义
说明
GEOMETRY
空间数据
任何一种空间类型
POINT
点
坐标值
LINESTRING
线
有一系列点连接而成
POLYGON
多边形
由多条线组成
索引内部原理剖析
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上,这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级.所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度.换句话,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数.
索引内部原理-Hash算法
索引内部原理-二叉树和二叉平衡树
索引内部原理-BTREE树
MyISAM存储引擎
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.
InnoDB存储引擎
InnoDB的叶节点的data域存放的是数据,相比MyISAM效率高一些,但是比较占硬盘内存大小.
索引的特点
-- 优点
① 大大加快数据的查询速度
② 使用分组和排序进行数据查询时,可以显著减少查询时分组和排序的时间
③ 创建唯一索引,能够保证数据库表中每一行数据的唯一性
④ 在实现数据的参考完整性方面,可以加速表和表之间的连接
-- 缺点
① 创建索引和维护索引需要消耗时间,并且随着数据量的增加,时间也会增加.
② 索引需要占据磁盘空间
③ 对数据表中的数据进行增加,修改,删除时,索引也要动态的维护,降低了维护的速度
索引的创建原则
① 更新频繁的列不应该设置索引
② 数据量小的表不要使用索引(毕竟总共2页的文档,还要目录?)
③ 重复数据多的字段不应设为索引(比如 性别,只有男和女一般来说:重复的数据超过百分之15就不应该建索引)
④ 首先应考虑对where和order by 和group by 涉及的列上建立索引
MySQL的存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据
不同的储存引擎提供不同的存储机制、索引技巧、锁定水平等功能,现在许多不同的数据库管理系统都支持多种不同的数据引擎,MySQL的核心就是存储引擎
用户可以根据不同的需求为数据表选择不同的存储引擎
可以使用SHOW ENGINES 命令可以查看MySQL的所有执行引擎我们可以看到默认的执行引擎是innoDB支持事务,行级锁定和外键.
MySQL存储引擎的操作
-- 查询当前数据库支持的存储引擎
show engines;
-- 查看当前的默认存储引擎
show variables like '%storage_engines%';
-- 查看某个表用了什么引擎(在现实结果里参数engine后面的就表示该表当前用的存储引擎)
show create table student;
-- 创建表时指定存储引擎
create table(...) engine=MyISAM;
-- 修改数据库引擎
alter table student engine=InnoDB;
alter table student engine=MyISAM;
-- 修改MySQL默认存储引擎方法
① 关闭mysql服务
② 找到mysql安装目录下的my.ini文件
③ 找到default-storage-engine = InnoDB 改为目标引擎
④ 启动mysql服务