博客
关于我
Mysql进阶索引篇03——2个新特性,11+7条设计原则教你创建索引
阅读量:789 次
发布时间:2023-02-13

本文共 1661 字,大约阅读时间需要 5 分钟。

MySQL 索引深度探讨

1. 索引的声明与使用

1.1 索引的分类

索引可以从以下几个方面进行分类:

  • 按功能逻辑划分

    • 普通索引:适用于普通字段,没有特殊约束。
    • 唯一索引:用于唯一性约束的字段,确保数据不重复。
    • 主键索引:与主键相关,通常伴随主键约束。
    • 联合索引:覆盖多个字段的索引,提升查询效率。
    • 全文索引:支持全文检索,适用于文本数据。
    • 空间索引:用于存储空间数据,如地理坐标。
  • 按物理实现划分

    • 聚簇索引:主键或唯一性索引,存储在同一块存储空间。
    • 非聚簇索引:与数据页独立存储。
  • 按作用字段个数划分

    • 单列索引:仅对单个字段进行优化。
    • 联合索引:对多个字段的查询进行加速。
  • 1.2 创建索引

    创建索引可以在表创建时或表已存在时进行。

    1.2.1 创建表时添加索引

    创建表时可以通过以下方式添加索引:

    CREATE TABLE book (    book_id INT,    book_name VARCHAR(100),    authors VARCHAR(100),    info VARCHAR(100),    comment VARCHAR(100),    year_publication YEAR,    INDEX year_publication);

    1.2.2 创建表后添加索引

    ALTER TABLE book ADD INDEX idx_cmt(comment);

    1.3 删除索引

    删除索引可通过以下命令执行:

    ALTER TABLE book DROP INDEX idx_cmt;

    2. MySQL 8.0 的索引新特性

    2.1 降序索引

    MySQL 8.0 支持真正的降序索引,InnoDB 存储引擎在排序时直接使用索引顺序。

    2.2 隐藏索引

    MySQL 8.x 支持隐藏索引,允许对索引进行软删除,避免频繁删除索引带来的性能影响。

    2.3 使隐藏索引对优化器可见

    通过设置 use_invisible_indexeson,可以控制索引对优化器的可见性。

    3. 适合创建索引的 11 种情况

    3.1 数据准备

    准备好数据后,可以通过存储过程和函数进行数据插入。

    3.2 适合创建索引的 11 种情况

  • 字段具有唯一性限制

    • 唯一性字段适合创建唯一索引,提升查询效率。
  • 频繁作为 WHERE 查询条件的字段

    • 对经常查询的字段创建索引,减少全表扫描。
  • 经常 GROUP BY 和 ORDER BY 的列

    • 对排序和分组字段创建索引,提升性能。
  • UPDATE 和 DELETE 的 WHERE 条件列

    • 对 WHERE 条件字段创建索引,减少锁竞争。
  • DISTINCT 字段需要创建索引

    • 对去重操作的字段创建索引,提升效率。
  • 多表 JOIN 连接操作的 WHERE 条件列

    • 对连接字段创建索引,提升查询效率。
  • 使用类型小的列创建索引

    • 主键字段适合创建索引,减少索引存储空间。
  • 使用字符串前缀创建索引

    • 对字符串字段创建前缀索引,提升查询效率。
  • 区分度高的列适合作为索引

    • 对选择度高的字段创建索引,提升查询效果。
  • 使用最频繁的列放到联合索引的左侧

    • 优化查询性能,减少索引使用次数。
  • 在多个字段都要创建索引的情况下,联合索引优于单值索引

    • 减少索引维护成本,提升查询效率。
  • 4. 限制索引的数目

    建议单张表的索引数目不要超过 6 个,避免索引过多带来的性能负担。

    5. 不适合创建索引的 7 种情况

  • 在 WHERE 中使用不到的字段,不要设置索引

    • 不必要的索引浪费资源。
  • 数据量小的表最好不要使用索引

    • 数据量少时,索引可能带来更大的性能损耗。
  • 有大量重复数据的列上不要建立索引

    • 重复数据的字段索引效率低下。
  • 避免对经常更新的表创建过多的索引

    • 索引维护成本高,影响性能。
  • 不建议用无序的值作为索引

    • 无序值的索引效率低下。
  • 删除不再使用或者很少使用的索引

    • 清理不必要的索引,优化数据库性能。
  • 不要定义冗余或重复的索引

    • 重复索引增加维护成本,无助于查询效率。
  • 转载地址:http://fmdfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql百万级数据查询优化
    查看>>
    MySQL的 DDL和DML和DQL的基本语法
    查看>>
    mysql的 if else , case when then, IFNULL
    查看>>
    MySQL的10种常用数据类型
    查看>>
    MySQL的btree索引和hash索引的区别
    查看>>
    mysql的cast函数
    查看>>
    MySql的CRUD(增、删、改、查)操作
    查看>>
    MySQL的DATE_FORMAT()函数将Date转为字符串
    查看>>
    mysql的decimal与Java的BigDecimal用法
    查看>>
    MySql的Delete、Truncate、Drop分析
    查看>>
    MySQL的Geometry数据处理之WKB方案
    查看>>
    MySQL的Geometry数据处理之WKT方案
    查看>>
    mysql的grant用法
    查看>>
    Mysql的InnoDB引擎的表锁与行锁
    查看>>
    mysql的InnoDB引擎索引为什么使用B+Tree
    查看>>
    MySQL的InnoDB默认隔离级别为 Repeatable read(可重复读)为啥能解决幻读问题?
    查看>>
    MySQL的insert-on-duplicate语句详解
    查看>>
    mysql的logrotate脚本
    查看>>
    MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)
    查看>>
    MySQL的on duplicate key update 的使用
    查看>>