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);
「建议建索引的场景:」
- 表的主键、外键必须有索引;
- 数据量超过300的表应该有索引;
- 经常与其他表进行连接的表,在连接字段上应该建立索引;
- 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
- 索引应该建在选择性高的字段上;
- 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
- A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
- B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
- C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
- D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
- E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
「不建议建索引的场景」
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
- 频繁进行数据操作的表,不要建立太多的索引;
- 删除无用的索引,避免对执行计划造成负面影响;
- 包含有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」类型的列上创建。