|
| 1 | +## 索引 |
| 2 | + |
| 3 | +### 基本概念 |
| 4 | + |
| 5 | +* 定义:索引是一种高效获取数据的数据结构 |
| 6 | +* mysql 索引类型:B-tree 索引和 hash 索引 |
| 7 | + * MyISAM 和 Innodb 存储引擎仅支持 BTREE 索引 |
| 8 | + * MEMORY 和 HEAP 存储引擎支持 BTREE 和 hash 索引 |
| 9 | +* 优缺点 |
| 10 | + * 优点 |
| 11 | + * 加快查询速度 |
| 12 | + * 唯一索引,可保证数据库中每行数据的唯一性 |
| 13 | + * 加速表的连接 |
| 14 | + * 使用分组和排序子句进行数据查询时,显著减少分组和排序时间 |
| 15 | + * 缺点 |
| 16 | + * 占用额外空间 |
| 17 | + * 降低性能(增删改),索引需动态维护 |
| 18 | +* 分类 |
| 19 | + * 普通索引和唯一索引 |
| 20 | + * 普通索引:数据库中基本索引类型,允许索引列插入重复值和空值 |
| 21 | + * 唯一索引:索引列值必须唯一,允许空值,主键索引是特殊的唯一索引,不许有空值 |
| 22 | + * 单列索引和组合索引 |
| 23 | + * 单列索引:一个索引只包含单个列,一个表可以有多个单列索引 |
| 24 | + * 组合索引:在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用 |
| 25 | + * 全文索引:在定义索引列上支持值的全文查找,允许索引列中插入重复值或空值,全文索引可在 char varchar 或者 text 类型上创建, |
| 26 | + * mysql 5.6 以前,只有 MyISAM 支持全文索引 |
| 27 | + * mysql 5.6 及以后,MyISAM 和 Innodb 均支持全文索引 |
| 28 | + |
| 29 | +### explain |
| 30 | + |
| 31 | +* id: select 的序列号,按 select 出现顺序增长,有几个 select 就有几个 id |
| 32 | +* select_type: 表示查询中每个 select 子句的类型 |
| 33 | + * simple:简单查询,不包含子查询和 union |
| 34 | + * primary:复杂查询中最外层的 select |
| 35 | + * subquery:包含在 select 中的子查询(不在 from 子句中) |
| 36 | + * derived:包含在 from 子句中的子查询,mysql 会将结果存在临时表 |
| 37 | +* table: 当前行在访问那个表 |
| 38 | +* partitions: |
| 39 | +* type:表示 mysql 在表中找到所需行的方式,又称访问类型 |
| 40 | + * 从最优到最差:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL |
| 41 | +* possible_keys:可能使用到的索引,但未必会使用 |
| 42 | +* key:实际查询中使用的索引,如未使用索引,则为 null |
| 43 | +* key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引长度 |
| 44 | +* ref:表示上述表连接的匹配条件,即那些列或常量被用于查找索引列上的值 |
| 45 | +* rows:估计要读取并检测的行数 |
| 46 | +* filtered: 返回的结果行占预估行的百分比 |
| 47 | +* extra:不适合在其他列显示但又十分重要的额外信息 |
| 48 | + |
| 49 | + |
| 50 | +### 参考资料 |
| 51 | +* [MySQL - 索引详解](https://juejin.im/entry/5a448726f265da43062b10f1) |
| 52 | +* [MySQL 表与索引设计攻略](https://juejin.im/post/5b207b026fb9a01e2b2cc8a0#heading-10) |
| 53 | +* [mysql explain详解](https://cloud.tencent.com/developer/article/1093229) |
0 commit comments