索引是帮助MySQL高效获取数据的数据结构。
索引的目的在于提高查询效率,可以类比字典。
我们平常说的索引,如果没有特别的指明,都是指B+树(多路搜索树,并不一定是二叉树)结构组织的索引。
2.2.1 优劣势
- 优势:
- 类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本。
- 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
- 类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本。
劣势:
单值索引
一个索引只包含单个列,一个表可以有多个单例索引(尽量不要超过5个)- 唯一索引
索引列的值必须唯一,但允许有空值 - 复合索引
一个索引包含多个列 - 基本语法
- 创建索引 ```sql CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC]) ALTER TABLE <表名> ADD [<索引类型>] INDEX [<索引名>] (<列名>,…)
—创建主键索引 ALTER TABLE <表名> ADD PRIMARY KEY [<索引名>] (<列名>) —创建唯一索引 ALTER TABLE <表名> ADD UNIQUE KEY [<索引名>] (<列名>) —创建普通索引 ALTER TABLE <表名> ADD KEY [<索引名>] (<列名>) —创建全文索引 ALTER TABLE <表名> ADD FULLTEXT KEY [<索引名>] (<列名>)
- **删除索引**```sqlDROP INDEX <索引名> ON <表名>
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询与其他表关联的字段,外键关系应该建立索引
- 频繁更新的字段不适合建立索引
- WHERE条件里用不到的字段不创建索引
- 单键与复合索引的选择(在高并发的情况下倾向于创建组合索引)
- 查询中排序的字段,排序字段若通过索引去访问大大提高排序速率
- 查询中统计或分组字段
- 表记录太少的不用建立索引
-
2.2.4 索引优化规则
最佳左前缀法则
指的是从索引的最左前列开始,并且不跳过索引中的列
按照定义的顺序写sql。如果一个模糊查询只使用到一个组合索引的最左索引,那这样还是能用到这个联合索引,并不需要新建一个单独的索引。- 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
- 存储引擎不能使用索引中范围条件右边的列
范围之后全失效 - 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
- MySQL在使用不等于( != 或者 <> )的时候无法使用索引会导致全表索引
- is null ,is not null 也无法使用索引
- like 以通配符开头( ‘%abc….’ ),索引失效会变成全表扫描
- 解决 like ‘%字符串%’ 时索引不被使用的方法?
使用覆盖索引解决部分内容
- 解决 like ‘%字符串%’ 时索引不被使用的方法?
- 字符串不加 单引号 索引失效
- 少用 or ,用它连接时索引会失效
**全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
Like百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
VAR引号不可丢,SQL高级也不难!**
