Mysql 数据库 第十七节 索引基础

mac2024-04-18  36

                                                             Mysql 索引基础


索引概述:

1.索引 是一种 特殊的文件, (innoDB)数据表上的索引 是表空间的一个组成部分。他们包含着对数据表里 所有记录的引用指针,

合理的使用索引的 Mysql 数据库:  兰博基尼

没有使用索引    的 Mysql 数据库: 人力三轮车

对于  没有索引的表: 单表查询 可能 几十万条数据 就已经到达瓶颈, 而通常 大型网站 单日 所产生的数据量 就会达到 几十万 甚至 几百万条, 所以没有索引的数据库 查询数据 会变得非常缓慢

2.使用索引的有点

大大提高 数据检索的 效率, 降低数据库的 IO 成本

对于分组 和 排序语句进行数据 检索, 可以减少分组 和排序 所消耗的时间, 降低 CPU 成本

3.使用索引的缺点

索引文件会 占用物理空间, 除了数据表需要占用空间以外。 没一个索引 还会占用一定的物理空间

当对标的数据 进行操作, insert, update, delete 的时候, 索引也要动态的维护,这样就会降低数据的维护速度

4.索引的分类

索引是在 储存引擎中 实现的, 也就是说 不同的引擎 会使用不同的索引

MyISAM  和 InnoDB 存储引擎: 只支持 BTREE 索引,也就是说 默认使用 BTREE, 不能够更换

MEMORY / HEAP    存储引擎: 支持 BTREE 和 HASH 索引两种

1.  索引我们分为 四类来讲

                *单列索引:(普通索引,唯一索引,主键索引), 一个表可以有多个单列索引                

                *组合索引:一个索引可以包含多列

                *全文索引: 只有在 MyISM 引擎上才能使用 ,只能在 CHAR VARCHAR  TEXT 类型字段上才使用

                *空间索引:作用于空间数据类型(不常用)

 

单列索引:

1. 普通索引

Mysql 中普通索引 类型,没有什么限制。允许在定义索引 的列中 插入 重复值 和 空值;纯粹为了查询数据更快一点

2. 唯一索引    unique

索引列中的值 必须是唯一的,但是允许为 null 值

3. 主键索引    primary key

是一种 特殊的 索引,不允许有 空值

 

分析表:用来查看所有是否 又被使用, 并且输出其中的索引信息

# emp 表名; eno = 1001 字段名 使用 EXPLAIN SELECT * FROM emp WHERE eno = 1001 ;

id:   SELECT 标识符,这里是 SELECT的 查询序列号,也就是一条语句中,SELECT 是第几次出现的。在此语句中只有一次。所有是1select_type: 所使用 SELECT 查询类型, SIMPLE 表示 为简单的 SELECT, 不使用 UNION 或者子查询, 就是 简单的 SELECTtable : 数据表的名字, 若有多个表  , 按被读取的先后排列type:   指定本 数据表 和 其他数据表 之间的关联 关系。 该表中 所有符合 检索值的记录 都会被 取出来 和 从上一个表中 取出的数据 联合possible_key: Mysql 在搜索 数据记录的时候 可以选用 各个索引, 该表中 没有索引key:  实际 使用的索引key_len:  显示了 Mysql 使用索引的长度(也就是使用的索引 个数),当 key 字段为 NULL 时, 索引的长度也就是 NULLref :    给出关联 关系中 另一个表中的 关联列的名称, 常亮 (const),这里没有使用使用关联 索引是 NULLrows: Mysql 在执行 这个查询的时候  预计会从这个数据表里 独处数据行的 个数extra: 提供了与 关联 操作的 相关信息,没有则什么都不写

 

索引的创建:

#创建索引 CREATE INDEX 索引名称 ON 表名 (列名1|列名1); #删除索引 DROP INDEX 索引名称 ON 表名; DROP INDEX eno_index ON emp; CREATE INDEX eno_index ON emp (eno);

1.什么情况下下 需要建立索引

主键自动建立唯一 索引

频繁作为 查询条件的字段 应该创建索引

查询中 与 其他表 关联的字段外键关系 建立索引

频繁更新 的字段 不适合 建立索引, 应为每次更新的 不只是数据, 还有更新索引

WHERE 条件 里 用不到的 字段不 创建索引

查询中 排序的字段 需要建立 索引, 大大 提高 排序的效率

查询中 统计 或者 分组的字段需要建立 索引

2.大多数 情况下 索引能 大幅提高查询 效率, 但是:

数据的变更(增删改) 都需要维护索引,因此更多的索引 意味着 更多的 维护成本

更多的 索引意味着 也需要跟多的空间(一本 100 页的书, 你还要去找50页的目录?)

过小的表,建立索引可能会 更慢   (读个两夜的宣传手册,你还要去看 目录)

3. 什么样的字段 不适合 建立索引

一般来说: 列的值 唯一性太小,(如, 性别, 星期, ), 不太适合建立索引,(怎么叫 太小? 一般来说 同值的数据量超过 表的  15% , 那么久没必要建立索引了

太长的列, 可以选择只 建立部分索引,例如(只取 前 十位 做索引)

更新非常 频繁的数据  不适宜 做 索引

补充:  1、事务隔离级别为读提交时,写数据只会锁住相应的行   2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。   3、事务隔离级别为串行化时,读写数据都会锁住整张表    4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

 

 

索引结构:

BTREE 索引:

又叫做 B+ 数索引,是一个平衡的 多叉树,从根节点 到每个叶节点的 高度差不超过 1, 而且同层级别 的节点间 有指针相互连接

关于 二叉树 更详细的 介绍

 

HASH 索引:

哈希索引 就是采用一系列 哈希算法,把键值 算成 哈希值, 检索时不需要 类似 B+树 那样, 从根节点到 叶节点 逐级查找,只需要一次 哈希 算法即可立即定位到数据。 类似于 JAVA 中的  HashMap 取数据。 但是 Hash 索引 只适用于 MEMORY / HEAP 存储引擎

 

最新回复(0)