索引是帮助MySQL高效获取数据的数据结构
索引的目的在于提高查询效率,可以类比字典。
我们平常说的索引,如果没有特别的指明,都是指B+树(多路搜索树,并不一定是二叉树)结构组织的索引。

2.2.1 优劣势

  • 优势:
    • 类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本
    • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
  • 劣势:

    • 实际上索引也是一张表,也会占用空间
    • 虽然索引大大提高了查询速率,同时却会降低更新表的速度

      2.2.2 分类

  • 单值索引
    一个索引只包含单个列,一个表可以有多个单例索引(尽量不要超过5个)

  • 唯一索引
    索引列的值必须唯一,但允许有空值
  • 复合索引
    一个索引包含多个列
  • 基本语法
    • 创建索引 ```sql CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC]) ALTER TABLE <表名> ADD [<索引类型>] INDEX [<索引名>] (<列名>,…)

—创建主键索引 ALTER TABLE <表名> ADD PRIMARY KEY [<索引名>] (<列名>) —创建唯一索引 ALTER TABLE <表名> ADD UNIQUE KEY [<索引名>] (<列名>) —创建普通索引 ALTER TABLE <表名> ADD KEY [<索引名>] (<列名>) —创建全文索引 ALTER TABLE <表名> ADD FULLTEXT KEY [<索引名>] (<列名>)

  1. - **删除索引**
  2. ```sql
  3. DROP INDEX <索引名> ON <表名>
  • 查看索引
    1. SHOW INDEX FROM <表名> [ FROM <数据库名>]

    2.2.3 使用情况

  • 主键自动建立唯一索引
  • 频繁作为查询条件的字段应该创建索引
  • 查询与其他表关联的字段,外键关系应该建立索引
  • 频繁更新的字段不适合建立索引
  • WHERE条件里用不到的字段不创建索引
  • 单键与复合索引的选择(在高并发的情况下倾向于创建组合索引)
  • 查询中排序的字段,排序字段若通过索引去访问大大提高排序速率
  • 查询中统计或分组字段
  • 表记录太少的不用建立索引
  • 数据重复且平均的字段不适合建立索引,没有太大的意义

    2.2.4 索引优化规则

  • 最佳左前缀法则
    指的是从索引的最左前列开始,并且不跳过索引中的列
    按照定义的顺序写sql。如果一个模糊查询只使用到一个组合索引的最左索引,那这样还是能用到这个联合索引,并不需要新建一个单独的索引。

  • 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
  • 存储引擎不能使用索引中范围条件右边的列
    范围之后全失效
  • 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
  • MySQL在使用不等于( != 或者 <> )的时候无法使用索引会导致全表索引
  • is null ,is not null 也无法使用索引
  • like 以通配符开头( ‘%abc….’ ),索引失效会变成全表扫描
    • 解决 like ‘%字符串%’ 时索引不被使用的方法?
      使用覆盖索引解决部分内容
  • 字符串不加 单引号 索引失效
  • 少用 or ,用它连接时索引会失效

**全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
Like百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
VAR引号不可丢,SQL高级也不难!**