Mysql高级14-索引是什么

定义:排好序的快速查找数据结构。在数据本身之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据;这样就可以在这些数据结构上实现高级查找算法。这种数据结构就是索引。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往已索引文件的形式存储在磁盘上。
我们平常所说的索引,如果没有特别知名,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集符合索引、前缀索引、唯一索引默认都是B+树索引,统称索引。
下图就是一种可能的索引方式示例:
BTree

优缺点:
优点:
类似大学图书馆建书目录索引,提高数据检索的效率,降低数据库的IO成本;
通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
缺点:
只增加查询速度,相反会降低新增,修改,删除的效率。只能提高查询速度,虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update、delete。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。

实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。

索引是提高效率的一个因素,如果你的mysql有大量的表,需要花时间研究监利最优秀的索引。 索引不是越多越好,根据实际情况添加不同的索引。

分类一:
单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。
唯一索引:索引你列的值必须唯一,但允许空值。
复合索引:即一个索引包含多个列
基本语法:

CREATE [UNIQUE] INDEX indexName ON mytabe(columnname(length));
ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length));
DROP INDEX [UNIQUE] ON mytable;
SHOW INDEX FROM tabke_name\G;
ALTER TABEL table_name ADD PRIMARY KEY(column_list)
alter table table_name add unique index_name (column_list);
alter table tabel_name add index index_name (column_list);
alter table table_name add fulltext index_name (column_list);

分类二:
Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。

  1. BTREE
    BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

  2. FULLTEXT
    即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
    全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题

  3. HASH
    由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。
    HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

  4. R-TREE
    RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
    相对于BTREE,RTREE的优势在于范围查找。

2、索引种类
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
ps.
索引合并,使用多个单列索引组合搜索
覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖

3、什么情况下不推荐使用索引?

  1. 数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引
    比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。

  2. 频繁更新的字段不要使用索引
    比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。

  3. 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引只有在where语句出现,mysql才会去使用索引

4) where 子句里对索引列使用不等于(<>),使用索引效果一般。

哪些情况下建立索引:
1、主键自动建立唯一索引你
2、频繁作为查询条件的字段应该建立索引
3、查询中与其他表关联的字段,外键关系建立索引
4、频繁更新的字段不适合穿件索引
5、where条件里用不到的字段不穿件索引
6、单键/组合索引的选择问题,who?在高并发下倾向创建组合索引。
7、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度。
8、查询中统计或者分组字段

哪些情况下不用建索引:
1、表记录太少
2、经常增删改查的表
3、数据重复且分布平均的表字段

性能分析:


版权声明:本文为xiaoyuedake原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。