MySql优化-索引优化

索引简介

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。

一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上

我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈稀索引(hash index)等。

优势:提高数据检索的效率,降低数据的IO成本;降低数据排序的成本,降低了CPU的消耗

劣势:虽然索引大大提高了查询速度,同时却会降低更新表的速度;实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的

索引分类

单值索引:一个索引只包含单个列,一个表可以有多个单列索引

唯一索引:索引列的值必须唯一,但允许有空值

复合索引:一个索引包含多个列

索引操作

创建索引:

-- 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
CREATE [UNIQUE] INDEX indexName ON tableName(columnName(length));

ALTER TABLE tableName ADD [UNIQUE] INDEX indexName(columnName);

删除索引:

DROP INDEX [indexName] ON tableName; 

查看索引:

SHOW INDEX FROM tableName;

索引失效的情况

  1. 复合索引要遵守前缀法则:指的是查询从索引的最左列开始并且不跳过索引中的列
    • 在复合索引中,最左端的索引没有使用,或者左端使用了但中间的索引列没有,会导致后面的索引失效
    • 在复合索引中,对中间的索引操作(范围),会导致后面的索引失效
  2. 在索引列上做任何操作(计算、函数、类型转换等)会导致索引失效
  3. like以通配符开头(‘%abc…’)mysql索引失效会变成全表扫描的操作,也就是说like 后的%放在右边,否则导致索引失效
  4. 字符串不加单引号索引失效
  5. 少用or,用它来连接时会索引失效
  6. is null ,is not null 也无法使用索引

猜你喜欢

转载自blog.csdn.net/u013435893/article/details/80690874