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