mysql_索引

「用CREATE语句创建索引」

  #普通索引
  CREATE INDEX index_name ON table_name(column_name1,column_name2);

  #非空索引
  CREATE UNIQUE INDEX index_name ON table_name (column_name);

  #主键索引
  CREATE PRIMARY KEY INDEX index_name ON table_name (column_name);

「建议建索引的场景:」

  1. 表的主键、外键必须有索引;
  2. 数据量超过300的表应该有索引;
  3. 经常与其他表进行连接的表,在连接字段上应该建立索引;
  4. 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
  5. 索引应该建在选择性高的字段上;
  6. 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
  • A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
  • B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
  • C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
  • D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
  • E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

「不建议建索引的场景」

  1. 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
  2. 频繁进行数据操作的表,不要建立太多的索引;
  3. 删除无用的索引,避免对执行计划造成负面影响;
  4. 包含有NULL值的列不要建索引。

 

 

「最左前缀法则」

「范围查询右侧列索引失效」

  SELECT * FROM table_name WHERE age>? AND name=?;

「查询字符串类型的字段不带单引号索引失效」

  SELECT * FROM table_name WHERE id=12213123921384;

mysql在使用like查询的时候只有使用后面的%时,才会使用到索引

「 WHERE 子句后面,AND连接 一个索引字段和非索引字段,都会走索引,用or连接就不会走索引」

「FULLTEXT (全文索引)的用途是什么?和普通索引有什么区别?」

「解答:」

InnoDB 引擎对 FULLTEXT 索引的支持是 MySQL5.6 新引入的特性,之前只有 MyISAM 引擎支持 FULLTEXT 索引。

对于 FULLTEXT 索引的内容可以使用 MATCH()…AGAINST() 语法进行查询。

「全文搜索的语法」:

MATCH(col1,col2,…) AGAINST (expr[search_modifier])

  • 其中MATCH中的内容为已建立FULLTEXT索引并要从中查找数据的列,
  • AGAINST中的expr为要查找的文本内容,search_modifier为可选搜索类型。

search_modifier的可能取值有:

  • IN NATURAL LANGUAGEMODE:自然语言全文搜索(默认模式)
  • IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION:带查询扩展的自然语言全文搜索
  • IN BOOLEAN MODE:布尔全文搜索
  • WITH QUERY EXPANSION:查询扩展全文搜索

「全文索引和普通索引的区别:」

用途:

  • FULLTEXT 用于搜索很长一篇文章的时候,效果最好。(适合在进行模糊查询的时候使用)
  • 用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。

区别:

  • 普通索引没有唯一性之类的限制(即索引列的所有值可重复,这里提一嘴UNIQUE索引,UNIQUE索引列的所有值不可重复)。
  • 全文索引适用于查询长文本,可以在「CHAR、VARCHAR」或者「TEXT」类型的列上创建。
posted @ 2022-05-06 11:24  血染星辰  阅读(24)  评论(0)    收藏  举报