索引优化分析
文章目录
1、索引的概念
1.1、是什么?
MySQL 官方对索引的定义为: 索引(Index) 是帮助 MySQL 高效获取数据的数据结构。
-
可以得到索引的本质:索引是数据结构。
可以简单理解为**排好序的快速查找数据结构**。
在数据之外, 数据库系统还维护着满足特定查找算法的数据结构, 这些数据结构以某种方式引用(指向) 数据,这样就可以在这些数据结构上实现高级查找算法。 这种数据结构, 就是索引。 下图就是一种可能的索引方式示例:
-
左边是数据表, 一共有两列七条记录, 最左边的是数据记录的物理地址。
为了加快 Col2 的查找, 可以维护一个右边所示的二叉查找树, 每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针, 这样就可以运用二叉查找在一定的复杂度内获取到相应数据, 从而快速的检索出符合条件的记录。
一般来说索引本身也很大, 不可能全部存储在内存中, 因此索引往往以索引文件的形式存储的磁盘上。
1.2、优缺点
优势:
- 提高数据检索的效率, 降低数据库的 IO 成本;
- 通过索引列对数据进行排序, 降低数据排序的成本, 降低了 CPU 的消耗。
劣势:
- 虽然索引大大提高了查询速度, 同时却会降低更新表的速度, 如对表进行 INSERT、 UPDATE 和 DELETE。 因为更新表时, MySQL 不仅要保存数据, 还要保存一下索引文件每次更新添加了索引列的字段, 都会调整因为更新所带来的键值变化后的索引信息;
- 实际上索引也是一张表, 该表保存了主键与索引字段, 并指向实体表的记录, 所以索引列也是要占用空间的。
2、Mysql 的索引
2.1、Btree 索引
MySQL 使用的是 Btree 索引:
-
一颗 b 树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示);
如磁盘块 1 包含数据项 17 和 35, 包含指针 P1、 P2、 P3,P1 表示小于 17 的磁盘块,P2 表示在 17 和 35 之间的磁盘块,P3 表示大于 35 的磁盘块。
-
**真实的数据存在于叶子节点**即 3、 5、 9、 10、 13、 15、 28、 29、 36、 60、 75、 79、 90、 99。
-
非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如 17、 35 并不真实存在于数据表中。
3、Mysql 索引分类
-
单值索引
概念:即一个索引只包含单个列, 一个表可以有多个单列索引。
-
唯一索引
概念:索引列的值必须唯一, 但允许有空值。
-
主键索引
概念:设定为主键后数据库会自动建立索引, innodb 为聚簇索引。
-
复合索引
概念:即一个索引包含多个列。
3.1、基本语法
操作 | 命令 |
---|---|
创建 | CREATE [UNIQUE] INDEX[indexName] ON table_name(column)) |
删除 | DROP INDEX [indexName] ON mytable; |
查看 | SHOW INDEX FROM table_name\G |
使用 Alter 命令 | ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) : 该语句添加一个主键, 这意味着索引值必须是唯一 的, 且不能为 NULL。 |
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) | |
ALTER TABLE tbl_name ADD INDEX index_name (column_list) : 添加普通索引, 索引值可出现多次。 | |
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list) :该语句指定了索引为 FULLTEXT , 用于全文索 引。 |
4、索引的创建时机
4.1、适合创建索引的情况
- 主键自动建立唯一索引;
- 频繁作为查询条件的字段应该创建索引;
- 查询中与其它表关联的字段,外键关系建立索引;
- 单键/组合索引的选择问题,组合索引性价比更高;
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度;
- 查询中统计或者分组字段。
4.2、不适合创建索引的情况
- 表记录太少;
- 经常增删改的表或者字段;
- Where 条件里用不到的字段不创建索引;
- 过滤性不好的不适合建索引。