MySql优化-索引优化

索引简介

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

通常来讲索引自己也很大,不可能所有存储在内存中,所以索引每每以索引文件的形式存储的磁盘上web

咱们日常所说的索引,若是没有特别指明,都是指B+树结构组织的索引。其中汇集索引,次要索引,覆盖索引,复合索引,前缀索引,惟一索引默认都是使用B+树索引,统称索引。固然,除了B+树这种类型的索引以外,还有哈稀索引(hash index)等。sql

优点:提升数据检索的效率,下降数据的IO成本;下降数据排序的成本,下降了CPU的消耗 数据结构

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

索引分类

单值索引:一个索引只包含单个列,一个表能够有多个单列索引 函数

惟一索引:索引列的值必须惟一,但容许有空值 mysql索引

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

索引操做

建立索引: code

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

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

删除索引: xml

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 也没法使用索引