MYSQL索引(一)

索引介绍

索引是什么

官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能
加快数据库的查询速度。方便查找—检索 索引查询内容—覆盖索引 排序
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在 单独的索引文件中,也可能和数据一起存储在数据文件中)。
我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都 是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。
索引的优势和劣势

优势:

可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。 – 检索
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。 --排序

  • 被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。
  • 如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多。
  • where 索引列 在存储引擎层 处理

劣势:

  • 索引会占据磁盘空间
  • 索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。

索引的分类

单列索引

  • 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询 数据更快一点。 add index
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值. add unique index
  • 主键索引:是一种特殊的唯一索引,不允许有空值。 pk

组合索引

  • 在表中的多个字段组合上创建的索引 add index(col1,col2…)
  • 组合索引的使用,需要遵循最左前缀原则(最左匹配原则,后面高级篇讲解)。
  • 一般情况下,建议使用组合索引代替单列索引(主键索引除外,具体原因后面知识点讲解)。

全文索引

  • 只有在MyISAM引擎、InnoDB(5.6以后)上才能使用,而且只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。 fulltext
  • 优先级最高 先执行 不会执行其他索引
  • 存储引擎 决定执行一个索引

空间索引

不做介绍,一般使用不到。

索引的使用

创建索引

  • 单列索引之普通索引
CREATE INDEX index_name ON table(column(length)) ;
ALTER TABLE table_name ADD INDEX index_name (column(length)) ;
  • 单列索引之唯一索引
CREATE UNIQUE INDEX index_name ON table(column(length)) ;
ALTER TABLE table_name add unique index index_name(column);
  • 单列索引之全文索引
CREATE FULLTEXT INDEX index_name ON table(column(length)) ;
ALTER TABLE table_name add fulltext index_name(column)
  • 组合索引
ALTER TABLE table_name ADD INDEX index_titme_time (title(50),time(10)) ;
  • 删除索引
DROP INDEX index_name ON table
  • 查看索引
SHOW  INDEX FROM table_name \G

索引原理分析

索引的存储结构

索引存储结构

  • 索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引
  • MyISAM和InnoDB存储引擎:只支持B+ TREE索引, 也就是说默认使用BTREE,不能够更换
  • MEMORY/HEAP存储引擎:支持HASH和BTREE索引

B树和B+树

数据结构示例网站:

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

B树图示

B树是为了磁盘或其它存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多 叉)平衡查找树。 多叉平衡
在这里插入图片描述

  • B树的高度一般都是在2-4这个高度,树的高度直接影响IO读写的次数。
  • 如果是三层树结构—支撑的数据可以达到20G,如果是四层树结构—支撑的数据可以达到几十T

B树和B+树的区别

B树和B+树的最大区别在于非叶子节点是否存储数据的问题。

  • B树是非叶子节点和叶子节点都会存储数据。
  • B+树只有叶子节点才会存储数据,而且存储的数据都是在一行上,而且这些数据都是有指针指向的,也就是有顺序的。 索引列 order by

非聚集索引(MyISAM)

B+树叶子节点只会存储数据行(数据文件)的指针,简单来说数据和索引不在一起,就是非聚集索引。
非聚集索引包含主键索引和辅助索引都会存储指针的值

主键索引

在这里插入图片描述

这里设表一共有三列,假设我们以 Col1 为主键,则上图是一个 MyISAM 表的主索引(Primary key)示意。可以看出MyISAM 的索引文件仅仅保存数据记录的地址。
在这里插入图片描述

辅助索引(次要索引)

在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索的key可以重复。如果我们在 Col2 上建立一个辅助索引,则此索引的结构如下图所示
在这里插入图片描述

同样也是一颗 B+Tree,data 域保存数据记录的地址。因此,MyISAM 中索引检索的算法为首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其data 域的值,然后以 data 域的值为地址,读取相应数据记录。

聚集索引(InnoDB)

  • 主键索引(聚集索引)的叶子节点会存储数据行,也就是说数据和索引是在一起,这就是聚集索引
  • 辅助索引只会存储主键值
  • 如果没有没有主键,则使用唯一索引建立聚集索引;如果没有唯一索引,MySQL会按照一定规则创建聚集索引。

主键索引

InnoDB 要求表必须有主键(MyISAM 可以没有),如果没有显式指定,则 MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为 InnoDB 表生成一个隐含字段作为主键,类型为长整形。
在这里插入图片描述

上图是 InnoDB 主键索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为 InnoDB 的数据文件本身要按主键聚集。

辅助索引(次要索引)

第二个与 MyISAM 索引的不同是 InnoDB 的辅助索引 data 域存储相应记录主键的值而不是地址。换句话 说,InnoDB 的所有辅助索引都引用主键作为 data 域。

聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
select * from user where name=‘Alice’ 会进行回表查询(回到主键的索引中带出所有值)
select id,name from user where name=‘Alice’ 覆盖索引 (索引中就可以获取到想要的值)
select id, age,name from user where name=‘Alice’ 覆盖索引
回表查询 检索两次 非主键索引 — pk—索引—>数据

在这里插入图片描述

引申:为什么不建议使用过长的字段作为主键?

因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。 同时,请尽量在 InnoDB 上采用自增字段做表的主键。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问表中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建表时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的表上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全表扫描。可以使用OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值