MySQL索引的介绍、建立、使用

什么是索引

索引(在MySQL中也叫做“键(key)") 是存储引擎用于快速找到记录的一种数据结构。
索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时,性能则会急剧下降。
索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500页是目录,它当然效率低,目录是要占纸张的,而索引是要占磁盘空间的。

常见索引介绍

B-Tree索引(MySQL使用B+Tree)
B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。

B+Tree索引是B-Tree的改进版本,同时也是数据库索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,B+Tree进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。

  • 哈希索引(MySQL中不能主动创建hash索引)
    基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。

问:为什么官方建议使用自增长主键作为索引?
区别聚簇索引->数据存储方式

索引的类型

  1. 索引的类型:UNIQUE(唯一索引):不可以出现相同的值,可以有NULL值

  2. INDEX(普通索引):允许出现相同的索引内容

  3. PROMARY KEY(主键索引):不允许出现相同的值
  4. fulltext index(全文索引):可以针对值中的某个单词,但效率确实不敢恭维
  5. 组合索引:实质上是将多个字段建到一个索引里,列值的组合必须唯一

索引的使用

创建索引(较简单,自行了解)

 

//普通索引

alter table table_name add index index_name (column_list) ;

//唯一索引

alter table table_name add unique (column_list) ;

//主键索引

alter table table_name add primary key (column_list) ;

查询时使用索引

create table book(

        name varchar(50) not null,

       type varchar(50) not null,

      author varchar(50) not null,

      date varchar(50) not null,

      key(type,price,date)

索引生效的查询:

  • 全值匹配:查询类型为历史,作者为三毛,日期为2019年3月1日的书
  • 匹配最左前缀:查询类型为历史的书
  • 匹配列前缀:查询类型为开头的书
  • 匹配范围值:查询类型为历史小说之间的书
  • 精确匹配某一列并范围匹配:查询类型为历史的书,并且作者为三开头的书。
  • 只访问索引的查询

限制的查询:

  • 如果不是按照索引的最左列开始查找,则无法使用索引
  • 无法跳过索引中的列
  • 如果查询中有某个列为范围查找,则其右边的列无法使用索引

高性能的索引策略

  1. 独立的列

例如,下面这个查询无法使用userId列的索引

select * from user where userId - 1 = 5;

很容易看出WHERE中的表达式其实等价于userId = 6,但是MySQL无法自动解析这个方程式。这完全是用户行为。我们应该养成简化WHERE条件的习惯,始终将索引列单独放在比较符号的一侧。

假设user表对userId存在索引,是否可以使用该索引?

如果查询中的列不是独立的,则MySQL就不会使用索引。索引列不能是表达式的一部分,也不能是函数的参数,养成始终将索引列放在比较符号的一侧的习惯

  1. 使用短索引      
    对串列进行索引,如果可以就应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
  2. like语句操作     
    一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引。
  3. 不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
  4. 索引要建立在经常进行select操作的字段上。      
    这是因为,如果列很少用到,那么有无索引并不能明显改变查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
  5. 索引要建立在值比较唯一的字段上
  6. 覆盖索引:
    什么是覆盖索引,就是索引的叶子节点中包含所有要查询的数据,这样就不需要“回表”查询了,大大提高了查询速度。
  7. 删除未使用的索引
  8. order by排序也遵从最左前缀

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值