【MySQL索引】-- 系统总结

由于之前一般做的是小项目,一般用不着索引,所以索引这块很长时间没有接触过了,现在由于需要做一个比较大的项目,数据库设计的时候需要考虑使用索引,所以现在重新回顾了一下索引相关的知识,顺便把以前记录的一些笔记,注意事项进行整理,在此总结分享出来,希望能梳理清楚MySQL索引的相关知识。

0x01.索引概述

1.索引的定义

  • MySQL官方定义:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
  • 简而言之:索引其实就是数据库本身帮着维护的一种数据结构,实际上也是一张表。这种数据结构存在的意义就是为了实现高效查找。

2.索引的结构

  • 索引都是在数据库的存储引擎中实现的。MySQL支持的索引类型如下:

    • BTREE索引:也就是我们常说的B树索引。是最常见的索引类型。
    • R-tree索引:空间索引,常用于空间位置的数据类型。
    • HASH索引:哈希索引,使用简单的索引,但是只有Memory引擎支持。
    • Full-txt索引:全文索引。
  • 一般常说的聚集索引,前缀索引,复合索引,唯一索引,默认都是使用的B+tree类型的索引。这些索引统称为索引。

  • 一般说得索引,指的就是B+树。

3.索引的分类

  • 唯一索引:索引列的值必须唯一。(可以存在空值)
  • 单值索引:一个索引只包含一个列。(一张表中可以有多个单列的索引)
  • 复合索引:一个索引可以包含多个列。

4.索引的优点

  • 使用索引进行数据的排序,降低了CPU的消耗。
  • 使用索引进行高效查找,降低了数据库的IO消耗。

5.索引的缺点

  • 高效查找所带来的缺陷是:更新表的速度会减慢。
  • 索引也占用了一张表的空间资源。

0x02.MySQL有关索引的语法

1.索引的创建

  • 为一张表的某个列创建索引。
  • 第一个可选指的是索引的结构(唯一索引,全文索引,空间索引),不指定就是默认的普通索引。
  • 第二个可选指的是索引的类型,不指定就是默认的索引类型。
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING  index_type]
ON tbl_name(index_col_name,...)

  • 例如:为person表的grade列创建索引:
create index idx_per_gra on person(grade);

2.索引的查看

  • 查看一张表的索引:
SHOW INDEX FROM table_name;

3.索引的删除

  • 删除一张表中的某个索引。
DROP  INDEX  index_name ON table_name;

4.索引的alter

-- 添加普通索引
alter table table_name add index index_name(column_list);
-- 添加一个主键,索引值唯一且非空
alter table table_name add primary key(column_list);
-- 添加唯一索引
alter table table_name add unique index_name(column_list);
-- 指定全文索引
alter table table_name add fulltext index_name(column_list);

0x03.避免索引失效

  • 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。

  • 违法最左前缀法则 , 索引将会失效。

  • 如果符合最左法则,但是出现跳跃某一列,只有最左列索引生效。

  • 范围查询右边的列,不能使用索引 。

  • 2.不要在索引列上进行运算操作,如果在索引列上进行运算操作,索引将会失效。

  • 3.字符串不加单引号.由于在查询时,没有对字符串加单引号,MySQL的查询优化器,会自动的进行类型转换,造成索引失效。

  • 4.尽量使用覆盖索引(只访问索引的查询(索引列完全包含查询列)),减少select * 。

    扫描二维码关注公众号,回复: 11444030 查看本文章
  • 5.以%开头的Like模糊查询,索引失效

  • 6.in 走索引, not in 索引失效

  • 7.尽量使用复合索引,而少使用单列索引

  • 8.先使用MySQL评估,再考虑使用索引,如果MySQL评估使用索引比全表更慢,则不使用索引。

  • 9.用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

0x04.索引的设计原则

  • 往往对查询频次高,数据量大的表建立索引。
  • 利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。
  • 索引字段的选择,最佳候选列应当从where子句的条件中提取,如果where子句中的组合比较多,那么应当挑选最常用、过滤效果最好的列的组合。
  • 使用唯一索引,区分度越高,使用索引的效率越高。
  • 使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O效率,也可以提升总体的访问效率。假如构成索引的字段总长度比较短,那么在给定大小的存储块内可以存储更多的索引值,相应的可以有效的提升MySQL访问索引的I/O效率。

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/107463528