索引的应用场景以及如何使用

时间:2021-08-11 21:16:25

唯一的是什么?

  1. 索引列(字段)的所有值都只能出现一次,即必须唯一

--------------------------------------------------------------------------------

主键索引与唯一索引的区别

  1. 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

  2. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

  3. 唯一性索引列允许空值,而主键列不允许为空值。

  4. 主键列在创建时,已经默认为空值 ++    唯一索引了。

  5. 一个表最多只能创建一个主键,但可以创建多个唯一索引。

  6. 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

  7. 主键可以被其他表引用为外键,而唯一索引不能。   ?

--------------------------------------------------------------------------------

复合索引

  1. 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)

  2. 就是几个字段联合在一起组成一个索引.复合索引的创建方法与创建单一索引的方法完全一样。

  3. 但复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。

  4. 当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度。

--------------------------------------------------------------------------------

abc) (ab) (ac)(bc)(a) (b) (c

  1. 复合索引又叫联合索引。

  2. abc    ab    a     ac  可以

  3. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。

  4. 例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 ,当最左侧字段是常量引用时,索引就十分有效。

--------------------------------------------------------------------------------

除复合索引外,什么情况下索引被使用,什么情况下不会被使用

  1. 建立索引的目的就是帮助查询,如果查寻用不到则索引就没有必要建立。

  2. 如果表是经常需要更新的也不适合做索引 。频繁更新会导致索引也会频繁更新,降低写的效率。

  3. 唯一性差的字段不适合创建索引。

  4. 当给一个字段创建了索引的话,而这个字段要进行like模糊查询的话,那么这个值左边不可以有%,因为索引查询是要从左到右的,你如果给它加上%后,左边的值不是确定的话,它会找不到这个索引。所以在使用like模糊查询的时候,值得左边不可以有%

  5. order by  不会使用索引

  6. or 当前后2个字段都有索引时才可以索引出来 否则不可以。

  7. 如果数据表过大(5w以上)则有些字段(字符型长度超过(40))不适合作为索引。查询大量数据时,索引有效,但是慢

  8. 不使用索引的原因:因为索引时会先过一遍索引在过一遍数据

--------------------------------------------------------------------------------

全文检索:

  1. 全文检索就是FULLTEXT,用于 MyISAM 表,在列类型为 CHARVARCHAR TEXT 列上创建。

  2. 将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (CREATE INDEX) 创建索引,这将是非常快的。

  3. 将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。

  4. MySQL自带的全文索引只能对英文进行全文检索。要检索中文用sphinx

  5. 创建全文检索:alter table 表名 add fulltext index 索引名(列名,[列名][列名]..(可以有多个,可以有一个)

  6. 在创建表的时候建全文检索:CREATE TABLE article (

  7.      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

  8.      FULLTEXT (title, content) --titlecontent列上创建全文索引

);

--------------------------------------------------------------------------------

场景

  1. 当数据多且字段值有相同的值得时候用普通索引。

  2. 当字段多且字段值没有重复的时候用唯一索引。

  3. 当有多个字段名都经常被查询的话用复合索引。

  4. 普通索引不支持空值,唯一索引支持空值。

  5. 但是,若是这张表增删改多而查询较少的话,就不要创建索引了,因为如果你给一列创建了索引,那么对该列进行增删改的时候,都会先访问这一列的索引,

  6. 若是增,则在这一列的索引内以新填入的这个字段名的值为名创建索引的子集,

  7. 若是改,则会把原来的删掉,再添入一个以这个字段名的新值为名创建索引的子集,

  8. 若是删,则会把索引中以这个字段为名的索引的子集删掉。

  9. 所以,会对增删改的执行减缓速度,

  10. 所以,若是这张表增删改多而查询较少的话,就不要创建索引了。

  11. 更新太频繁地字段不适合创建索引。

  12. 不会出现在where条件中的字段不该建立索引。

--------------------------------------------------------------------------------

索引创建

CREATE [UNIQUE|CLUSTERED] INDEX INDEX_NAME ON TABLE_NAME(PROPERTY_NAME)

其中UNIQUECLUSTERED为可选项,分别是建立唯一索引和聚簇索引,具体解释为:

UNIQUE:表示此索引的每一个索引值只对应唯一的数据。

CLUSTERED:表示要建立的索引时聚簇索引,即索引项的顺序与表中记录的物理顺序一致的索引组织

ALTER TABLE table_name ADD INDEX index_name (column_list)