目录
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 | 最左 |
列 字符串 | 加上引号,隐式类型转换,不会使用索引 |