索引在日常的查询中用的很多,在面试的时间也 经常被问题,用一点时间统一整理下。
索引就像之前用的字典的拼音,用于快速查找表中的某一条数据或某一些数据。如果没有索引,那么数据库引擎只能全表扫描 ,表越大,扫描的时间 越长,查询的速度越慢。如果表中查询的列有一个索引,MySQL 没有 必要检索全表,可以直接找到某些数据。就好像我们可以根据拼音快速找到某个字在字典中的位置。
先基本上理解索引,然后等以后真正用到了,就会慢慢知道别的作用。注意,学习这张,很重要的一点就是必须先得知道索引是什么,索引是干嘛的,有什么作用,为什么要索引等等,如果不知道,就重复往上面看看写的文字,好好理解一下。一个表中很够创建多个索引,这些索引度会被存放到一个索引文件中(专门存放索引的地方)。
注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引 MyISAM 和 InnoDB 存储引擎:只支持 BTREE 索引, 也就是说默认使用 BTREE,不能够更换 MEMORY/HEAP 存储引擎:支持 HASH 和 BTREE 索引
索引我们分为四类来讲 单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引、
单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。 这里不要搞混淆了。
组合索引 在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。 组合索引:用多个列组合构建的索引,这多个列中的值不允许有空值
ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3');
遵循“最左前缀”原则,把最常用作为检索或排序的列放在最左,依次递减,组合索引相当于建立了 col1,col1col2,col1col2col3 三个索引,而 col2 或者 col3 是不能使用索引的。 在使用组合索引的时候可能因为列名长度过长而导致索引的 key 太大,导致效率降低,在允许的情况下,可以只取 col1 和 col2 的前几个字符作为索引
ALTER TABLE 'table_name' ADD INDEX index_name(col1(4),col2(3));
表示使用 col1 的前 4 个字符和 col2 的前 3 个字符作为索引
全文索引 全文索引,只有在 MyISAM 引擎上才能使用,只能在 CHAR,VARCHAR,TEXT 类型字段上使用全文索引, 在实际工作中 并 没有使用过,因为 InnoDB 是用的更普遍的数据库引擎。
空间索引 空间索引是对空间数据类型的字段建立的索引,MySQL 中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用 SPATIAL 关键字。要求,引擎为 MyISAM,创建空间索引的列,必须将其声明为 NOT NULL。
创建索引
CREATE TABLE 表名( 属性名 数据类型[完整性约束条件],
属性名 数据类型[完整性约束条件],
......
属性名 数据类型
[ UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[ 别名] ( 属性名1 [(长度)] [ ASC | DESC] )
);
- 添加普通索引: ALTER TABLE t_user ADD INDEX IDX_USER__USER_ID(user_id);
- 添加唯一索引: ALTER TABLE t_user ADD UNIQUE INDEX IDX_USER__UNQ_USER_ID(user_id);
- 添加复合索引: ALTER TABLE t_user ADD UNIQUE INDEX IDX_USER__COMP_USER_ID(user_id,user_name);