1.1、MySQL 索引 是什么?
索引是一个单独的、存储在 磁盘 上的 数据库结构 ,包含着对数据表里 所有记录的 引用指针。
1.2、 MySQL 索引 的存储类型有哪些?
MySQL中索引的存储类型有两种,即 BTree 和 Hash。
1.3、MySQL 索引 在哪里实现的?
索引是在存储引擎中实现的。(MySQL 的存储引擎有:InnoDB、MyISAM、Memory、Heap)
1.4、存储引擎 是什么?
存储引擎就是指 表的类型 以及 表在计算机上的存储方式。
1.5、索引 的优缺点有哪些?
优点:
缺点:
1、普通索引 和 唯一索引
普通索引:MySQL 中的基本索引类型,允许在定义索引的列中插入 重复值 和 空值
唯一索引:要求索引列的值必须 唯一,但允许 有空值
2、单列索引 和 组合索引
3、全文索引
4、空间索引
空间索引 是对 空间数据类型 的字段 建立的索引
MySQL中的空间数据类型有4种,分别是 Geometry、Point、Linestring 和 Polygon
MySQL 使用 Spatial 关键字进行扩展,使得能够用创建正规索引类似的语法创建空间索引
创建空间索引的列,不允许为空值,且只能在 MyISAM 的表中创建。
5、前缀索引
MySQL 索引 的数据结构可以分为 BTree 和 Hash 两种,BTree 又可分为 BTree 和 B+Tree。
Hash:使用 Hash 表存储数据,Key 存储索引列,Value 存储行记录或行磁盘地址。
Hash 只支持等值查询(“=”,“IN”,“<=>”),不支持任何范围查询(原因在于 Hash 的每个键之间没有任何的联系),Hash 的查询效率很高,时间复杂度为 O(1)。
BTree:属于多叉树,又名多路平衡查找树。
性质:
查询过程,例如:Select * from table where id = 6;
BTree 的不足:
B+Tree:在 BTree 的基本上,对 BTree 进行了优化:只有叶子节点才会存储 键值 - 数据,非叶子节点只存储 键值 和 子节点 的地址;叶子节点之间使用双向指针进行连接,形成一个双向有序链表。
等值查询,例如:Select * from table where id = 8;
范围查询,例如:Select * from table where id between 8 and 22;
B+Tree 的优点:
数据和索引都存储在一个文件中(.ibd)
一般情况下,聚簇索引等同于主键索引;除 聚簇索引 外的所有索引 均称为 辅助索引
InnoDB(B+Tree)叶子节点中存储的键值为索引列的值
每一张表都有一个聚簇索引
根据在 辅助索引树 中获取的 主键id,再到 主键索引树 查询数据的过程 称为 回表 查询
组合索引
辅助索引:
组合索引:
覆盖索引:
create index idx on user(name, age, gender);
-- 使用覆盖索引
explain select name, age, gender from user where name ='万叶' and age = 18 and gender = '0';
-- 未使用覆盖索引
explain select * from user where name ='万叶' and age = 18 and gender = '0';
5.1、MySQL 索引 的基本语法
创建表时:
create table table_name(
[col_name data_type] [unique | fulltext | spatial...],
[unique...] [index | key] [index_name] (col_name [length], ...)
);
create table user (
id INT NOT NULL,
name CHAR(30) NOT NULL,
unique index uniqueIdx(id)
);
表已存在时:
-- 第一种
alter table table_name
add [unique...] [index | key] [index_name] (col_name [length], ...);
alter table user add unique index uniqueIdx(id);
-- 第二种
create [unique...] index index_name
on table_name (col_name [length], ...);
create unique index uniqueIdx on user(id);
-- 删除索引
drop index index_name on table_name;
5.2、怎么判断要不要加索引?
加索引:
不加索引:
5.3、只要创建了索引,就一定会生效吗?
不一定。当使用 组合索引 时,如果没有遵循 最左匹配 原则,索引不生效。
例如,创建 id、name、age 组合索引
5.4、怎样判断索引是否生效?
使用 explain 关键字。
例如:
explain select * from user where id = 1;
5.5、怎么避免索引失效?