索引是什么?

索引的结构?

索引可以有B-Tree索引,Hash索引。索引是在存储引擎中实现的

InnoDB / MyISAM 仅支持 B-Tree索引

Memory/Heap 支持B-Tree索引和Hash索引

MySQL索引与优化的相关知识点有哪些?

MySQL索引与优化的相关知识点有哪些?

InnoDB中一个页的大小为16KB(一个页即B+树上的一个节点),若表的主键为INT,大小为4字节,那一个节点也能够存储4K个键值,假设指针和键值都占相同大小,那么高度为3的B+树,第二层有2048个节点,第三层的叶子节点数为2048*2048 = 4194304,一个节点为16KB,则一共可容纳67108864KB,即65536MB,即64G的数据。

由于叶子节点是被一个链表串起来的,所以若order by 索引列,则默认已经是排好序的,所以效率会很高。

MySQL索引与优化的相关知识点有哪些?

MyISAM的辅助索引和主键索引一样,唯一的区别是,辅助索引中的key可以重复,而主键索引的key不能重复

MySQL索引与优化的相关知识点有哪些?

 InnoDB的辅助索引,叶子节点中存的是主键值,而不是地址。走辅助索引,需要检索2次。

MySQL索引与优化的相关知识点有哪些?

InnoDB和MyISAM索引的区别:

问题

索引存在哪儿?

索引的优缺点?

索引的分类

 索引使用

 CREATE INDEX index_name ON table_name(col_name);
-- 或者
ALTER TABLE table_name ADD INDEX index_name(col_name)
DROP INDEX index_name ON table_name;

explain执行计划

现有一张user表,其索引如下所示

MySQL索引与优化的相关知识点有哪些?

其中name,age,address 三个字段作为一个组合索引

可以使用explain对某个SQL语句进行性能分析

explain select * from user where name = 'am';

MySQL索引与优化的相关知识点有哪些?

possible_keys
可能用到的索引
key
实际用到的索引
key_len
用于查询的索引的长度
ref
如果是等值查询,这里会会是const
rows
预计需要扫描的行数(不是精确值)
extra

额外信息,如

MySQL索引与优化的相关知识点有哪些?

type

MySQL索引与优化的相关知识点有哪些?

下面是满足了最左前缀规则,即对idx_name_age_add来说,满足了最左前缀,第一个索引为name

MySQL索引与优化的相关知识点有哪些?

MySQL索引与优化的相关知识点有哪些?

MySQL索引与优化的相关知识点有哪些?

注意like时,通配符%不能放在开头,否则会导致全表扫描

MySQL索引与优化的相关知识点有哪些?

MySQL索引与优化的相关知识点有哪些?

MySQL索引与优化的相关知识点有哪些?

索引使用规范(索引失效分析)

  1. 全值匹配
    在索引列上使用等值查询

explain select * from user where name = 'y' and age = 15;

MySQL索引与优化的相关知识点有哪些?

2. 最左前缀

组合索引中,查询条件要从组合索引的最左列开始,如上述example中组合索引idx_name_age_add,是建立在三个列name,age,address的,若跳过name,直接用age查询,则会变为全表扫描

explain select * from user where age = 15;

MySQL索引与优化的相关知识点有哪些?

3. 不要在索引列上做计算

4. 范围条件右侧的索引列会失效

MySQL索引与优化的相关知识点有哪些?

看到第一个SQL语句,没有用上addresss索引

5. 尽量使用覆盖索引

explain select name,age from user where name = 'y' and age = 1;

可以避免回表查询

6. 索引字段不要使用不等(!= 或 <>),不要判断null(is null/ is not null)
会导致索引失效,转为全表扫描

MySQL索引与优化的相关知识点有哪些?

MySQL索引与优化的相关知识点有哪些?

7. 索引字段上使用like时,不要以%开头

MySQL索引与优化的相关知识点有哪些?

8. 索引字段如果是字符串,记得加单引号

MySQL索引与优化的相关知识点有哪些?

9. 索引字段不要用or

MySQL索引与优化的相关知识点有哪些?

例子总结:

MySQL索引与优化的相关知识点有哪些?