MYSQL索引概述&查询计划

01、目标

掌握索引创建的语法和规则

02、概述

MYSQL索引是一种数据结构:b+tree + hash 进行实现和存储架构。

03、索引分类

  • 普通索引:单纯的为了加快查询速度。
  • 全文索引:针对text/longtext字段类型加索引。(es)
  • 唯一索引:加快查询速度,且约束该列的值不能重复。
  • 主键索引:和唯一功能类似,单是一张表中只能有一个主键索引,复合索引有多个。

作用:

普通的索引:就是未来建设的复合索引,或者组合索引,其实大部分的索引的优化都是建设普通索引

全文索引:一般开发不使用,因为全文索引达不到到中文的分词的具体效果。所以后续都使用es进行取代

唯一索引:给我表某列简历唯一约束,这样的好处可以防止脏数据(可以解决数据的幂等性)。比如订单号,email、openid、appid等都可以考虑使用唯一约束。

幂等性 == 不论你执行多少次,其结论都是一个。

主键索引:你只要在给表创建一个主键列,主键索引自动创建。不需要你额外的申明。如果没有主键列呢?就找一个唯一约束的列,如果都没有呢?就找一个默认rowid作为的索引列。*所以在使用innodb引擎的数据表的时候,一定要给表建立主键列

##04、索引相关的概念

  • =聚集索引(聚簇索引):也就是说Innodb引擎的表都有一个且唯一一个聚集索引(默认是主键)。如果没有主键列会选择唯一键的列,如果都没有,则隐式的rowid作为聚集索引。

    表的文件:.frm .ibd ------>ibdata

  • 非聚簇索引(二级索引):所有非聚集索引,都称为二级索引。myisam

  • 单列索引:索引只涉及一个列

  • 多列索引(复合索引、联合索引、组合索引):索引涉及多个列(最好<=16个)

  • 覆盖索引:这不是一种索引。是指:在查询的时候,“查询语句所有的列,刚好都包含在查询条件的索引列中”。比如:user_index

05、覆盖索引

它并不是一种给某个列创建索引之类的操作。它是在查询的时候,“查询语句所有的列,刚好都包含在查询条件的索引列中。

SELECT nickname,age,male FROM kss_user

– id,email,name —查询语句所有的列

CREATE INDEX nickname_age_male_index ON kss_user(nickname,age,male);
  • 覆盖索引和顺序是没有关系的

06、like走不走索引问题,为什么在开发中尽量不要写 *?

SELECT nickname,age,male FROM kss_user where nickname like '%1%'

like全模糊匹配可以在:覆盖索引的情况下是可以进行索引命中。

为什么在开发中不要去写*呢。就 是如果你刚好查询的列,是索引列的话,有可能就命中所谓的覆盖索引。

当然:我们开发过程中,千万不要为了去走这种所谓的覆盖索引,然后就给一个SQL语句的所有的列建立组合索引呢?

当然不是,讲覆盖索引的意义就是告诉你:如果可以走覆盖索引就一定要去想法去靠近。总比不比走要好。

举个列子:

SELECT count(id) FROM system_user;

在开发中求count建议大家多使用索引列进行求取总数,这样的可能命中到覆盖索引。默认情况下:无论你是count(1)还是count(*) 还是count(id)都走覆盖索引index。索引统计速度是非常快的。

07、总结

1、覆盖索引:它并不是一种给某个列创建索引之类的操作。它是在查询的时候,“查询语句所有的列,刚好都包含在查询条件的索引列中。

2:普通索引,全文索引,唯一索引,主键索引(创建表只要主键列自动就会建设)。

3:在开发过程中,如果能够使用索引列查询,尽量不要写*。在开发中少写*吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值