【MySQL】索引的那些前世今生

目录

1.分类

1.1 按语法

1.2 按物理存储结构

1.3 按数据结构

1.3.1 Btree索引

1.3.2 Hash索引

1.3 按字段数量

2. 设计索引

2.1 选择合适的数据类型

3.命中索引


1.分类

1.1 按语法

类别 语法 描述
普通索引 index KEY `idx_pay_sp_order` (`F_sp_no`,`F_order_no`) 最基本的索引类型,没有唯一性之类的限制
唯一索引 unique UNIQUE KEY `uk_trans_code` (`trans_code`) 不允许其中任何两行具有相同索引值的索引
主键索引 key PRIMARY KEY (`F_id`)

唯一,聚集顺序

全文索引 FULLTEXT KEY content_tag_fulltext(content,tag) 适用于大量的文本数据

1.2 按物理存储结构

类别 描述
聚集索引 主键

一个表一个聚集索引。

数据和索引存放在同一文件中,以主键为索引存储数据

表中行的物理顺序与键值的逻辑(索引)顺序相同。

非聚集索引 普通字段

一个表多个非聚集索引

数据和索引分开单独存放在不同的文件中,索引文件不存储数据,而是存储数据的地址或者主键

1.3 按数据结构

1.3.1 Btree索引

性质  
多叉

阶m:叉数的最大值 

叉数限制:根节点最少可以有两个分支[2,m]、非根非叶子的分支个数为 [ ceil(m/2),m]

key数:(分叉数-1),叶最多m-1个

key有序

搜索树

节点内有序,

节点间 大于左子,小于右子

叶子-数据页

聚集:所有数据均存储在叶子节点,叶子包含所有key,叶子成一个链

非聚集:存储地址或者主键key

聚集索引

普通索引(二级)

1.3.2 Hash索引

类似内存中的HashMap

1.3 按字段数量

  • 单一索引
  • 组合索引

2. 设计索引

2.1 列选择

原则 原因  
key 小

由于越小,一个索引页存放的key越多,索引树越矮

遍历快、占用内存小

整型 < date,time < char,varchar < blob
查询频繁的列 命中率高

where,<,<=,=,>,>=,between,in,like ‘xx%'

group by,order by,on从句中出现的列

离散度大 离散度越大,key越多,树能越长大

count distinct key 越大,离散程度越高

COUNT(DISTINCT colNm) / COUNT(*)

2.2 设计规范

单个索引中每个索引记录的长度不能超过64KB

单个表上的索引个数不能超过7个

分区表的分区字段(partition-key)必须有索引

3.命中索引

子句 使用限制
where

<,<=,=,>,>=,between,in

单个最左 like ‘xx%'

联合-最左原则  index(a,b,c),where a

group by 最左
order by 最左
join xx on 最左
列 字符串 加上引号,隐式类型转换,不会使用索引
发布了132 篇原创文章 · 获赞 122 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sarafina527/article/details/105441396
今日推荐