索引,是帮助MySQL高效获取数据的数据结构。排好序的快速查找数据结构。
平时所说的索引,没有特别指明,都是指B树(多路搜索树,并不一定是二叉树)结构组织的索引。
其中聚集索引、次要索引、覆盖索引、复合索引、前缀索引、唯一索引默认都是使用B+树,统称为索引。除了B+树这种类型的索引之外,还有哈希索引等。

索引语法

  • 主键索引:PRIMARY KEY
  • 唯一索引:UNIQUE
  • 普通索引:INDEX
  • 全文索引:FULLTEXT
    1. -- table_name 表明,column_name 字段名
    2. -- 添加索引
    3. create INDEX idx_name on table_name(`column_name`);
    4. ALTER TABLE `table_name` ADD INDEX idx_column_name (`column_name`);
    5. -- 联合索引
    6. create INDEX idx_name on table_name(`column1`, `column2`, `column3`);
    7. ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`);
    8. -- 查看索引
    9. SHOW INDEX FROM table_name
    10. -- 删除索引
    11. drop index idx_name on table_name;

    强制走某个索引

    -- 在表名后面添加 force index(索引名) 即强制走对应的索引
    select * from asset_stock_deliver force index(asset_stock_deliver_index_4) 
    where warehouse_name='上海-物料仓';
    

    MySQL 索引结构

    MySQL 索引结构
  1. BTree 索引
  2. Hash索引
  3. full-text 全文索引
  4. R-Tree索引

    索引下推

    -- bill_name 字段创建了普通索引
    explain select bill_name from asset_base_bill  where bill_name like '%单%';
    

    image.png

    哪些情况下需要创建索引

  5. 主键自动建立唯一索引

  6. 频繁作为查询条件的字段应该创建索引
  7. 查询中和其他表关联的字段,外键关系建立索引
  8. 频繁更新的字段不适合创建索引——因为每次更新不单单更新记录还会更新索引
  9. where条件立用不到的字段不创建索引
  10. 单键/组合索引的选择问题
  11. 查询中排序字段,排序字段若通过索引访问大大提高排序速度
  12. 查询中统计或者分组字段

    哪些情况下不需要创建索引

  13. 表记录太少

  14. 经常增删改的表的字段
  15. 数据重复且分布平均的表字段

聚集索引

聚集索引是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点成为数据页。
聚集索引的存储并不是物理上连续的,而是逻辑连续的。页通过双向链表链接,页按照主键顺序排序;每个页中的记录也是通过双向链表进行维护的。

非聚集索引

非聚集索引,叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了一个书签(bookmark),该书签用来告诉 Innodb 存储引擎哪里可以找到与索引相对应的行数据。由于 Innodb 存储引擎表是索引组织表,因此 Innodb 存储引擎的非聚集索引的书签就是相对应的行数据的聚集索引键。