一、唯一的是什么?
1. 索引列(字段)的所有值都只能出现一次,即必须唯一
--------------------------------------------------------------------------------
二、主键索引与唯一索引的区别
1. 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
2. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
3. 唯一性索引列允许空值,而主键列不允许为空值。
4. 主键列在创建时,已经默认为空值 + 唯一索引了。
5. 一个表最多只能创建一个主键,但可以创建多个唯一索引。
6. 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
7. 主键可以被其他表引用为外键,而唯一索引不能。
--------------------------------------------------------------------------------
三、复合索引
1. 用户可以在多个列上建立索引,这种索引叫做复合索引(联合索引),就是几个字段联合在一起组成一个索引。
2. 复合索引的创建方法与创建单一索引的方法完全一样。
3. 复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引。
4. 当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度。
--------------------------------------------------------------------------------
四、(abc) (ab) (ac) (bc) (a) (b) (c)
1. 复合索引又叫联合索引。
2. (a) (ab) (abc)可以
3. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分,该行为被称为最左原则。
4. 例如索引是key index (a,b,c)。可以支持(a)(ab)(abc)3种组合进行查找,但不支持(bc)进行查找 ,当最左侧字段是常量引用时,索引就十分有效。
--------------------------------------------------------------------------------
五、除复合索引外,什么情况下索引被使用,什么情况下不会被使用
1. 建立索引的目的就是帮助查询,如果查寻用不到则索引就没有必要建立。
2. 如果表是经常需要更新的也不适合做索引。频繁更新会导致索引也会频繁更新,降低写的效率。
3. 唯一性差的字段不适合创建索引,因为无法准确的找到想要的数据,所以查完索引后依然还需要过一遍数据,这样反而增加了查询量。
4. 当给一个字段创建了索引的话,而这个字段要进行like模糊查询的话,那么这个值左边不可以有%,因为索引查询是要从左到右的,你如果给它加上%后,左边的值不是确定的话,它会找不到这个索引。所以在使用like模糊查询的时候,值得左边不可以有%。
5. order by 使用单一索引时不被使用,与where字句中有复合索引时被使用,如果where字句中还有其他单一索引的字段,复合索引也将不被使用。如果存在多个order by组合,将会导致放弃使用索引。
6. where 语句里面如果带有or条件, myisam表能用到索引,innodb不行。or 当前后2个字段都有索引时才可以索引出来 否则不可以,但是根据mysql版本的不同,有的版本可以用到,有的版本用不到,但是如果涉及到sql语句优化的情况下,尽量不要使用or语句来查询。
7. 通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。
8. 如果数据表过大(5w以上)则有些字段(字符型长度超过(40))不适合作为索引。查询大量数据时,索引有效,但是慢。
9. 查询结果量大的时候不使用索引的原因:因为索引时会先过一遍索引在过一遍数据。
10. in/not in使用不到索引,因为in查询时会进行多次全表查询;
11. 比较符中,><有时可以用到,有时候用不到,<>用不到;
--------------------------------------------------------------------------------
六、索引是什么?索引索引的是谁?是整个字段值,还是前面一部分?哪一部分?
1. 索引是对数据库表中一列或多列的值进行排序的一种结构,从本质上来讲,索引就是一种数据结构。
2. 使用索引可快速访问数据库表中的特定信息。
3. 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
4. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
--------------------------------------------------------------------------------
七、全文检索
1. 全文检索就是FULLTEXT,用于 MyISAM 表,在列类型为 CHAR、VARCHAR 或 TEXT 列上创建。
2. 将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。
3. 将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。
4. MySQL自带的全文索引只能对英文进行全文检索。要检索中文用sphinx。
5. 创建全文检索:alter table 表名 add fulltext index 索引名(列名,[列名],[列名]..(可以有多个,可以有一个)。
6. 在创建表的时候建全文检索:
CREATE TABLE article (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY FULLTEXT (title, content));
(在title和content列上创建全文索引)。
--------------------------------------------------------------------------------
附一:应用场景
1. 当数据多且字段值有相同的值得时候用普通索引。
2. 当字段多且字段值没有重复的时候用唯一索引。
3. 当有多个字段名都经常被查询的话用复合索引。
4. 普通索引不支持空值,唯一索引支持空值。
5. 但是,若是这张表增删改多而查询较少的话,就不要创建索引了,因为如果你给一列创建了索引,那么对该列进行增删改的时候,都会先访问这一列的索引,
6. 若是增,则在这一列的索引内以新填入的这个字段名的值为名创建索引的子集,
7. 若是改,则会把原来的删掉,再添入一个以这个字段名的新值为名创建索引的子集,
8. 若是删,则会把索引中以这个字段为名的索引的子集删掉。
9. 所以,会对增删改的执行减缓速度,
10. 所以,若是这张表增删改多而查询较少的话,就不要创建索引了。
11. 更新太频繁地字段不适合创建索引。
12. 不会出现在where条件中的字段不该建立索引。
--------------------------------------------------------------------------------
附二:创建索引
CREATE [UNIQUE|CLUSTERED] INDEX INDEX_NAME ON TABLE_NAME(PROPERTY_NAME);
其中UNIQUE和CLUSTERED为可选项,分别是建立唯一索引和聚簇索引,具体解释为:
UNIQUE:表示此索引的每一个索引值只对应唯一的数据。
CLUSTERED:表示要建立的索引时聚簇索引,即索引项的顺序与表中记录的物理顺序一致的索引组织
ALTER TABLE table_name ADD INDEX index_name (column_list);