zoukankan      html  css  js  c++  java
  • MySQL索引的基本操作

    常见的索引类型

    • PROMARY KEY 主键索引,也是唯一索引,不允许重复数据。
    • UNIQUE INDEX唯一索引,不允许有重复数据。
    • INDEX 普通索引允许有重复数据。
    • 组合索引,对多个字段添加索引,上面几种都可设置为组合索引,组合索引需要满足最左前缀匹配原则。

    这里有个有争议的地方,若有组合索引(a,b),SQL查询的时候单独使用b列,使用Explain对SQL进行解释,会发现extra字段显示 using index,和我们常说的单独查询b不走索引不一样,
    实践上是因为组合索引的排列类似SQL中对2个字段进行 order by a,b 是在a有序的基础上对b进行排序,所以满足最左前缀的前提下才能对b进行高效查找,若单独使用b,会出现using index,但是因为此时b无序,无法高效查找,没有用上聚合索引。

    在索引优化中还涉及到一个常见的知识点 : 回表
    因为非主键索引是存储了索引字段你的数据和主键值,主键索引存储了整行的数据。若查询的数据中包含非该索引对应的字段,就会根据索引中存储的主键再去查一次数据,这个过程称为回表。
    若有 t(a[PROMARY KEY],b,c,d) 此时我们增加索引 CREATE INDEX b_c ON t(b,c)
    执行查询操作 SELECT b,c,d FROM t where b = xxx 因为组合索引中只有b c 字段和主键的值,所以需要回表【根据主键的值再去查一次表获得d】。
    执行查询操作 SELECT b,c,a FROM t where b = xxx 因为组合索引中只有b c 字段和主键的值,一次即可获取所需要的全部值,避免了回表操作。

    • 所以我们在查询过程中可以尽量避免回表来提升SQL性能

    下面是常用的索引操作的整理

    • 增加索引: CREATE INDEX b_c ON table_name(b,c) 或者 ALTER TABLE table_name ADD 索引类型 (unique,primary key,index)[索引名](字段名)

    • 删除索引:DROP INDEX index_name on table_name 或者ALTER TABLE table_name DROP INDEX index_name 或者 ALTER TABLE table_name DROP PROMARY KEY

    • 查看索引:SHOW INDEX FROM table_name

    • 分析索引:在SQL前加入关键字 explain

  • 相关阅读:
    20171012
    BZOJ[2563] 阿狸和桃子的游戏
    BZOJ[1028] [JSOI2007]麻将
    BZOJ[1972] [Sdoi2010]猪国杀
    BZOJ[1033] [ZJOI2008] 杀蚂蚁antbuster
    P5651 基础最短路练习题
    P3047 [USACO12FEB]Nearby Cows G
    P6190 魔法
    P2391 白雪皑皑 / BZOJ 2054 疯狂的馒头
    CSP 2020 J/S 初赛游记
  • 原文地址:https://www.cnblogs.com/threecha/p/12741874.html
Copyright © 2011-2022 走看看