zoukankan      html  css  js  c++  java
  • mysql 索引类型

    mysql是索引组织表(IOT)

    堆组织表(HOT)和索引组织表(IOT)的区别

    mysql 索引功能

    提高数据检查效率

    提高表间的JOIN效率

    唯一约束,保证数据一致

    提高排序和分组效率

    占用物理空间

    数据变更时,索引也随之更新,效率低

    索引创建时机

    select 频繁的列

    where 条件join的列

    经常排序/分组的列

    不建议创建索引的情况:基数低、更新频繁但查询不多,大字段(BLOB/TEXT),不怎么使用的列

    主键索引

    primary key,唯一标识一行记录,不能重复,不能为NULL

    业务不能使用

    不修改,少删除

    最好自增,非自增列做主键会造成较严重的空间浪费

    不使用随机值

    聚集索引/Clustered index

    一定程序决定数据的存储顺序,每张表只能有一个

    TokuDB引擎可以有多个聚集索引,MyISAM 没有聚集索引

    primary key 是聚集索引,但聚集索引不一定是主键索引;

    innodb的表不要求必须有主键,但一定会有聚集索引,因为innodb是索引组织表

    聚集索引优先选择列的条件

    INT/BIGINT

    数据连接(单调顺序)递增/自增

    如果表中有主键,inndb会选择主键索引作为主键索引;

    不建议的列:频繁修改、新增数据太过离散

    innodb聚集索引选择次序

    显式声明的主键

    第一个NOT NULLABLE的唯一索引

    ROWID(实例级/库级,6bytes)

    索引后会自动增加主键值

    索引的叶子节点,定义时不管是否包含了主键,都会自动存储主键值,用于回溯表。

    alter table test add i1(c1,c2) 与alter test test add i1(c1,c2,id) 效果相同,innodb自动为每个索引涉及的字段的末尾增加了主键列;

     mysql5.6.9之后,优化器可自动识别索引末尾的值(index extensions)

    唯一索引

    唯一约束

    可以为NULL

    一个表可以有多个

    唯一索引可以临时禁用,主键不可以

    联合索引

    多列组成,适合where条件中的多列组合

    可用于避免回表(回表,索引上没有要查找的数据,需要通过主键找到整行数据,然后再读取需要的列)

    将过滤性大的列放在联合索引的最左边,尽量在第一次过滤时,去除大量数据

    mysql8.0开始支持倒序索引,联合索引中可支持不同的排序规则

    覆盖索引

    索引中包含全部要查询的列,不需要再通过主键去访问整行数据,即不需要回表;

    执行计划中,Extra using index 

    分区表索引

    mysql分区表的索引也是全局的,与非分区表的索引一样,不支持单个分区的索引。所以没有分区表索引这一概念。

    索引的存储结构

    详见:Mysql索引底层数据结构与算法

    索引相关书箱推荐

    • 保证正版 数据库索引设计与优化 (美)拉赫登迈奇,(美)利奇,曹怡倩,赵建伟 电子工业出版社
     
    保证正版 数据库索引设计与优化 (美)拉赫登迈奇,(美)利奇,曹怡倩,赵建伟 电子工业出版社
  • 相关阅读:
    范畴定义
    泛函编程(0)-什么是泛函编程
    函数式语言的特性
    理解函数式编程
    未阅归档
    monad-本质解释- a monad is a design pattern--monad与泛型相关
    打印管理系统
    函数式JS: 原来promise是这样的monad
    Promise是Monad吗?
    Scala和范畴论 -- 对Monad的一点认识
  • 原文地址:https://www.cnblogs.com/perfei/p/14681768.html
Copyright © 2011-2022 走看看