好文要置顶
索引类型的区别及各适用场景
MySQL索引类型常见有:PRIMARY, INDEX,UNIQUE,FULLTEXT等。
- PRIMARY 主键。 就是 唯一 且 不能为空,每个表只能有一个。
- INDEX 普通索引,没有唯一性限制。
- UNIQUE 唯一索引。 与INDEX区别是不允许有重复。
- FULLTEXT 是全文索引,用于模糊查询检索文本信息。
举例:比如你在为某商场做一个会员卡的系统。这个系统有一个会员表,有下列字段:
- 会员编号 INT
- 会员姓名 VARCHAR(10)
- 会员身份证号码 VARCHAR(18)
- 会员电话 VARCHAR(10)
- 会员住址 VARCHAR(50)
- 会员备注信息 TEXT
那么这个 会员编号,作为主键,使用 PRIMARY
会员姓名 如果要建索引的话,那么就是普通的 INDEX
会员身份证号码 如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)
会员备注信息 , 如果需要建索引的话,可以选择 FULLTEXT,全文搜索。
主键VS唯一索引
- 主键是一种约束,唯一索引是一种索引,本质不同。
- 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
- 唯一性索引列允许空值,而主键列不允许为空值。
- 一个表最多只能创建一个主键,但可以创建多个唯一索引。
- 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
- 主键可以被其他表引用为外键,而唯一索引不能。
关于FULLTEXT
- 用于 MyISAM 表,在列类型为 CHAR、VARCHAR 或 TEXT 列上创建。
- 将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。
- 将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。
- MySQL自带的全文索引只能对英文进行全文检索。要检索中文用sphinx。
关于复合索引
- 用户可以在多个列上建立复合索引,就是几个字段联合在一起组成一个索引.复合索引的创建方法与创建单一索引的方法完全一样。
- 复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。
- 当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度。
- 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 ,当最左侧字段是常量引用时,索引就十分有效。
索引使用注意事项
- 建立索引的目的就是帮助查询,如果查寻用不到则索引就没有必要建立。
- 如果表是经常需要更新的也不适合做索引 。频繁更新会导致索引也会频繁更新,降低写的效率。
- 唯一性差的字段不适合创建索引。
- 当给一个字段创建了索引的话,而这个字段要进行like模糊查询的话,那么这个值左边不可以有%,因为索引查询是要从左到右的,你如果给它加上%后,左边的值不是确定的话,它会找不到这个索引。所以在使用like模糊查询的时候,值得左边不可以有%。
- order by 不会使用索引。
- or 当前后2个字段都有索引时才可以索引出来 否则不可以。
上述第四条注意事项举例:
在使用like关键字使用‘%’模糊查询时是否用到索引
EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_%';
上面的结果是全表扫描,并没有使用到索引。
只是使用一个%的查询结果:
EXPLAIN SELECT * FROM `user` WHERE username LIKE 'ptd_%';
这个使用到了索引。
EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_';
在前面使用%时也是全表扫描,没有使用到索引。
一般应用场景
- 当数据多且字段值有相同的值得时候用普通索引。
- 当字段多且字段值没有重复的时候用唯一索引。
- 当有多个字段名都经常被查询的话用复合索引。
- 普通索引不支持空值,唯一索引支持空值。
- 若是这张表增删改多而查询较少的话,就不要创建索引了,因为如果你给一列创建了索引,那么对该列进行增删改的时候,都会先访问这一列的索引。若是增,则在这一列的索引内以新填入的这个字段名的值为名创建索引的子集;若是改,则会把原来的删掉,再添入一个以这个字段名的新值为名创建索引的子集;若是删,则会把索引中以这个字段为名的索引的子集删掉。所以,若是这张表增删改多而查询较少的话,就不要创建索引了。
- 更新太频繁地字段不适合创建索引。
- 不会出现在where条件中的字段不该建立索引。