索引的分类
数据库默认会创建索引:
并不是给主键建立的索引,是给唯一键创建的
主键, 唯一键 , 6字节row_id(自动生成,一个不可见的字段) 这三个都可以被数据库用来创建索引
主键索引: 是唯一且非空的列创建的索引 比唯一键多一个非空
唯一索引: 可以有多个空值 但是不是空值的必须唯一的列创建的索引
普通索引: 给普通的一个列创建的索引 可以空也可以不唯一
全文索引: varchar char text 用于全文检索
组合索引: 由多个列一起形成的索引
索引和键的误区
键和索引是两个不同的概念:
键表示一个列的特征:
主键, 唯一 非空的列
唯一键, 唯一,可以有多个空的列
普通键, 可空可不唯一的列
索引表示通过什么样的键在内存磁盘上形成一个索引的数据结构:
主键索引: 是唯一且非空的列创建的索引 比唯一键多一个非空
唯一索引: 可以有一个空值 的列创建的索引
普通索引: 给普通的一个列创建索引 可以空也可以不唯一
全文索引: varchar char text 用于全文检索
组合索引: 由多个列一起形成的索引
常见的一些误区和混淆:
键的创建往往伴随着索引的产生,当我们的数据库检测到某些键存在时,自动就会进行创建索引了,还有就是某些键需要依赖索引:
唯一键: 如果我们想单纯约束一个列唯一,并且不是为了方便查询,自然想到只创建唯一键,不创建索引
但是! 键的是否唯一是由索引来约束的,因此不能创建唯一键不创建唯一索引,而是先创建唯一索引作
为约束
因此,唯一键和唯一索引必须一起出现
主键: 同理,如果创建主键,一定伴随着主键索引被数据库自动创建
联合主键: 多个列组成主键,形成联合主键的几个列都不能为空,但是却可以有重复,只要保证几个列都存在时,可以唯一定位到某一行数据
联合主键应用:
在这里使用的id name 联合主键:
id name都可以单独重复
但是当id name都重复是,就无法定位到唯一一行了,这种是不被允许的
组合索引
组合索引在不同索引类型有不同的表现形式:
普通组合索引: 两个都是普通列,组成的索引没有限制,两个列都不限制重复和空值
唯一联合索引: 两个可以都是普通列,也可以为两个列单独创建唯一索引,
不单独创建的情况下: 两个列随意,可重复,也可以空,但是两个列必须要能够指定唯一的一行
某列单独创建的情况: 要遵循不单独创建的要求,还要遵循单独创建的列不能重复 UNIQUE
主键联合索引: 两个都是非空列,但是不可以再为其中的某一列创建主键索引,但是可以创建唯一索引来约束这个列不能重复
不单独创建的情况下: 两个列随意,可重复,不可以空,但是两个列必须要能够指定唯一的一行
某列单独创建的情况: 要遵循不单独创建的要求,还要遵循单独创建唯一的列不能重复