前言
程序员避不开和数据库打交道,大数据更是如此,不管是 MySQL、Oracle、SQL Server 这些 OLTP 数据库,还是Greeplum、StarRocks、Hive、Spark SQL、Flink SQL、ClickHouse 等 OLAP 数据库,SQL 都是最基础最重要的能力,数据库知识也是每一个程序员必备的知识。
而当我们讨论 SQL 优化的时候,其实很大程度都是在围绕索引在做优化。
1、索引
1.1、索引概述
索引是帮助 MySQL 高效获取数据的数据结构(有序)。下面我们以查询 age=45 岁的用户为例进行说明:
1.1.1、有无索引对比
1)无索引
没有索引,就相当于每次查找我们都需要遍历全表,时间复杂度:O(N)
2)有索引
如果对 age 列建立了索引,我们假设这个数据结构是一颗二叉树,那么我们就不需要遍历全表,时间复杂度:O(logN)
1.1.2、优缺点
1)优点
- 提高数据检索的效率,降低数据库 IO 成本(磁盘寻址、读写数据都是 IO 成本)
- 通过索引对数据进行排序,降低数据排序的成本,降低 CPU 消耗
2)缺点
- 索引列也需要占用磁盘空间
- 索引大大提高查询效率的同时,也降低了更新数据的速度,当对表进行 CUD 操作时(因为要对树的节点进行操作),效率会降低
一般当我们考虑对一张表添加索引时,这两个缺点都可以忽略。因为第一磁盘很便宜,第二大部分业务系统中,查询操作是最多的。
1.2、索引结构
上一节我们了解了,索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要有以下几种: