「这是我参与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:如何判断什么字段适合创建索引?
- 首先主键的列,MySQL是默认创建索引的,保证主键的唯一性;
- 然后是作为和外表进行连接的字段(一般是外键)也适合创建索引加快连接的速度;
- 还有就是经常需要去搜索的列上,也适合添加索引,提过搜索速度;
-
- (冷知识,如果where上有两个搜索的字段,只在一个字段加索引,索引是不会起作用的)
- 经常排序的字段很适合添加索引,因为索引本身就是排序好的;
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查询语句的优化,底层逻辑是表的设计嘛,
- 比如说存储引擎是 innodb还是MyISAM(如果表会把查询多,而更新少的表使用 MyISAM存储引擎,当然还有是不能在 MyISAM表里开启事务,修改值,因为不支持事务,无法回滚);
- 还有就是表的索引设置,不能太多,如果太多会拖慢索引的查询速度,索引文件也会在硬盘里变大(当然小问题,顺带一说),一般一张表设置不超过6个吧好像;
- 再然后 sql查询语句的的优化就是,尽量走索引查询,加快查询速度;
-
- 比如不用 *查询,这样会走全表查询;
- 像 like的使用不要用左模糊查询或者全模糊查询,因为索引是前缀匹配的,左模糊或者全模糊会导致查询不走索引。
-
- 还有的总结就是编写 sql的时候注意要走索引查找,避免全表查找,在项目中一般在写了 查询sql语句后用
explain
关键字来查看有没有走索引。
- 还有的总结就是编写 sql的时候注意要走索引查找,避免全表查找,在项目中一般在写了 查询sql语句后用