Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL索引及优化

MySQL学习之索引及优化

作者:抠脚的大灰狼

这篇文章主要介绍MySQL的索引及优化,索引是帮助MySQL进行高效查询的一种数据结构。好比一本书的目录,能加快查询的速度,想进一步了解的小伙伴可以详细阅读本文

索引是什么?

索引的结构?

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

InnoDB / MyISAM 仅支持 B-Tree索引

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

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

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

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

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

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表,其索引如下所示

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

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

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

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

额外信息,如

type

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

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

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

  1. 全值匹配
    在索引列上使用等值查询
explain select * from user where name = 'y' and age = 15;

2. 最左前缀

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

explain select * from user where age = 15;

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

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

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

5. 尽量使用覆盖索引

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

可以避免回表查询

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

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

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

9. 索引字段不要用or

例子总结:

顺口溜:
全值匹配我最爱,最左前缀不放开。
带头大哥不能死,中间兄弟不能断。
索引列上不计算,范围查询后全断。
like百分号写最右,覆盖索引搞起来。
不等空值以及or,索引通通说拜拜。

到此这篇关于MySQL学习之索引及优化的文章就介绍到这了,更多相关MySQL索引及优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文