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
是一种 特殊的 索引,不允许有 空值
1.什么情况下下 需要建立索引
主键自动建立唯一 索引
频繁作为 查询条件的字段 应该创建索引
查询中 与 其他表 关联的字段, 外键关系 建立索引
频繁更新 的字段 不适合 建立索引, 应为每次更新的 不只是数据, 还有更新索引
WHERE 条件 里 用不到的 字段不 创建索引
查询中 排序的字段 需要建立 索引, 大大 提高 排序的效率
查询中 统计 或者 分组的字段需要建立 索引
2.大多数 情况下 索引能 大幅提高查询 效率, 但是:
数据的变更(增删改) 都需要维护索引,因此更多的索引 意味着 更多的 维护成本
更多的 索引意味着 也需要跟多的空间(一本 100 页的书, 你还要去找50页的目录?)
过小的表,建立索引可能会 更慢 (读个两夜的宣传手册,你还要去看 目录)
3. 什么样的字段 不适合 建立索引
一般来说: 列的值 唯一性太小,(如, 性别, 星期, ), 不太适合建立索引,(怎么叫 太小? 一般来说 同值的数据量超过 表的 15% , 那么久没必要建立索引了 )
太长的列, 可以选择只 建立部分索引,例如(只取 前 十位 做索引)
更新非常 频繁的数据 不适宜 做 索引
补充: 1、事务隔离级别为读提交时,写数据只会锁住相应的行 2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。 3、事务隔离级别为串行化时,读写数据都会锁住整张表 4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
BTREE 索引:
又叫做 B+ 数索引,是一个平衡的 多叉树,从根节点 到每个叶节点的 高度差不超过 1, 而且同层级别 的节点间 有指针相互连接
关于 二叉树 更详细的 介绍
HASH 索引:
哈希索引 就是采用一系列 哈希算法,把键值 算成 哈希值, 检索时不需要 类似 B+树 那样, 从根节点到 叶节点 逐级查找,只需要一次 哈希 算法即可立即定位到数据。 类似于 JAVA 中的 HashMap 取数据。 但是 Hash 索引 只适用于 MEMORY / HEAP 存储引擎