【MySQL】了解索引

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

一、概述

索引是一种用于快速查询检索数据的数据结构。

类比 索引--目录

打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。

二、优缺点

优点 缺点
大大加快数据的检索速度 创建索引和维护索引需要耗费许多时间,在对有索引的数据进行增删改时,需要动态的修改索引,降低 SQL执行效率。
通过添加唯一性索引可以确保数据库表中的每一行数据的唯一性 索引使用物理文件存储,会消耗一定空间
当查询数据量不大时, 不一定能带来速度的提升,索引查询不一定比全表查询快。

三、数据结构

MySQL索引使用的数据结构主要有 BTree索引哈希索引

查询单条记录的时候,可以选择哈希索引。

其他场景则使用 BTree索引。

四、索引类型

1、主键索引(Primary Key)

数据表的主键列使用的就是主键索引。

一张数据表有只能有一个主键,并且主键不能为 null,不能重复。

2、二级索引(辅助索引)

二级索引的叶子节点存储的数据是主键。就是说通过二级索引,可以定位主键的位置。

包含唯一索引、普通索引、前缀索引、全文索引等。

1-唯一索引(Unique Key)  

唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。

2-普通索引(Index)  

普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。

3-前缀索引(Prefix)  

前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。

4-全文索引(Full Text)

全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。

五、聚集索引&非聚集索引

1-聚集索引

聚集索引即索引结构和数据一起存放的索引。

主键索引属于聚集索引。

2-非聚集索引

非聚集索引即索引结构和数据分开存放的索引。

二级索引属于非聚集索引。


Q:MyISAM为什么查询快,更新慢?

  • 一个MyISAM表在硬盘中会有表结构、数据、索引三个文件,
    • 就是说是索引和数据是分开存储的;
      • 修改 MyISAM表的数据,还需要去维护索引,索引更新慢。
  • Innodb的数据和索引是放着同一个文件中的;
    • 就是说索引和数据存储在一起;
      • 修改 Innodb表的数据时,就不需要去维护索引了。

Q:如何判断什么字段适合创建索引?

  1. 首先主键的列,MySQL是默认创建索引的,保证主键的唯一性;
  2. 然后是作为和外表进行连接的字段(一般是外键)也适合创建索引加快连接的速度;
  1. 还有就是经常需要去搜索的列上,也适合添加索引,提过搜索速度;
    1. (冷知识,如果where上有两个搜索的字段,只在一个字段加索引,索引是不会起作用的)
    2. 经常排序的字段很适合添加索引,因为索引本身就是排序好的;

Q:B树索引?

索引的存储结构是 B树(balance tree)

1、结构实例


-->

广度优先,会把倾向于把树深度(层数)压扁,减少层数,加快检索速度。


2、自动层级控制

当树不平衡时,会通过改变树的头节点来让树保持平衡。

Q:组合索引?

通过组合索引,可以了解到索引的使用细节(前缀索引)。

CREATE TABLE article ADD INDEX index_title_time (title(50),time(10)); 
复制代码

创建和文字标题和发表时间的组合索引。

-- 使用到了组合索引
SELECT * FROM article WHERE title='测试' AND time=123456789;
SELECT * FROM article WHERE title='测试';
-- 没有使用到组合索引
SELECT * FROM article WHERE time=123456789;
复制代码

Q:解释SQL语句,判断是否走索引?

可以通过在 sql语句前面加 explain来判断语句是否走索引。

Q:sql查询语句的优化?

一般 sql查询语句的优化,底层逻辑是表的设计嘛,

  1. 比如说存储引擎是 innodb还是MyISAM(如果表会把查询多,而更新少的表使用 MyISAM存储引擎,当然还有是不能在 MyISAM表里开启事务,修改值,因为不支持事务,无法回滚);
  2. 还有就是表的索引设置,不能太多,如果太多会拖慢索引的查询速度,索引文件也会在硬盘里变大(当然小问题,顺带一说),一般一张表设置不超过6个吧好像;
  1. 再然后 sql查询语句的的优化就是,尽量走索引查询,加快查询速度;
    1. 比如不用 *查询,这样会走全表查询;
    2. 像 like的使用不要用左模糊查询或者全模糊查询,因为索引是前缀匹配的,左模糊或者全模糊会导致查询不走索引。
    1. 还有的总结就是编写 sql的时候注意要走索引查找,避免全表查找,在项目中一般在写了 查询sql语句后用 explain关键字来查看有没有走索引。

猜你喜欢

转载自juejin.im/post/7033418264428412959