MySQL 之索引

文章目录

  • 什么是索引
  • MySQL常用的索引
  • 各种索引的应用场景
  • 索引的两大类型hash与btree
  • 正确使用索引
  • 联合索引
  • Mysql索引失效场景

什么是索引

索引在MySQL中也叫做或者keyprimary keyunique keyindex key),是存储引擎用于快速找到记录的一种数据结构。索引可以减少IO次数,加速查询。
primary keyunique key,除了有加速查询的效果之外,还有约束的效果,primary key 不为空且唯一,unique key 唯一,而index key只有加速查询的效果,没有约束效果。
​索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

索引虽然会加快查询,但是会降低写入的效率,并且占用磁盘空间,所以不能无限制的创建索引。

强调: 一旦为表创建了索引,以后的查询最好先查索引,再根据索引定位的结果去找数据。

MySQL常用的索引

普通索引INDEX: 加速查找
唯一索引:

  • 主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
  • 唯一索引UNIQUE:加速查找+约束(不能重复)

联合索引:

  • PRIMARY KEY(id,name):联合主键索引
  • UNIQUE(id,name):联合唯一索引
  • INDEX(id,name):联合普通索引

各种索引的应用场景

会员表、字段如下:

会员编号 INT
会员姓名 VARCHAR(10)
会员身份证号码 VARCHAR(18)
会员电话 VARCHAR(10)
会员住址 VARCHAR(50)
会员备注信息 TEXT

会员编号,作为主键,使用 PRIMARY
会员姓名,如果要建索引的话,那么就是普通的 INDEX
会员身份证号码,如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)。

除此之外还有全文索引,即:FULLTEXT
会员备注信息 ,如果需要建索引的话,可以选择全文搜索。
用于搜索很长一篇文章的时候,效果最好。
用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
但其实对于全文搜索,并不会使用MySQL自带的该索引,而是会选择Lucene搜索引擎。

索引的两大类型hash与btree

在创建索引的时候,可以为其指定索引类型:hashbtree
hash类型的索引: 查询单条快,范围查询慢。
btree类型的索引: b+树,层数越多,数据量指数级增长(innodb默认支持它)。

不同的存储引擎支持的索引类型也不一样:

  • InnoDB 支持事务,支持行级别锁定,支持 B-treeFull-text 等索引,不支持 Hash 索引;
  • MyISAM 不支持事务,支持表级别锁定,支持 B-treeFull-text 等索引,不支持 Hash 索引;
  • Memory 不支持事务,支持表级别锁定,支持 B-treeHash 等索引,不支持 Full-text 索引;
  • NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-treeFull-text 等索引;
  • Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

正确使用索引

范围问题,或者说条件不明确,条件中出现这些符号或关键字:>、>=、<、<=、!= 、between...and...、like、

大于号、小于号:
MySQL 之索引_第1张图片
如果写where id >1 and id <1000000会发现,随着范围的增大,速度会越来越慢,会成倍的体现出来。

不等于!=:
MySQL 之索引_第2张图片
between …and…
MySQL 之索引_第3张图片
​ like
MySQL 之索引_第4张图片
使用like的时候,通配符写在最前面,也是需要全匹配一遍。

尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大扫描的记录数越少,唯一键的区分度是1。

联合索引

指对表上的多个列合起来做一个索引。

注意建立联合索引的一个原则: 最左匹配原则,所以建联合索引的时候,将区分度高的放在最左边,依次排下来,范围查询的条件尽可能的往后边放。

Mysql索引失效场景

例如: 一张USER表 有字段属性 name,age 其中name为索引。

索引失效的情况

  • select * from USER where name=‘xzz’ or age=16;
    当语句中带有or的时候即使有索引也会失效。
  • select * from USER where name like‘%xzz’;
    当语句索引 like 带%的时候索引失效(注意:如果上句为 like‘xzz’此时索引是生效的)
  • select * from USER where name=123;
    如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

假如将name和age设置为联合索引,一定要注意顺序,mysql联合索引有最左原则,下面以name,age的顺序举例:

(1)select * from USER where name=‘xzz’ and age =11;

(2)select * from USER where age=11 and name=‘xzz’;

上面两种情况:以name,age顺序为联合索引,(1)索引是生效的,(2)索引是失效的

比如age为索引:select * from USER where age-1>11;
索引失效,索引列不能参与计算,否则索引会失效。

你可能感兴趣的:(MySQL)