MySQL索引问题

索引的存储分类:
B-Tree索引:最常见的索引类型,大部分引擎都支持B树类型;
HASH索引:只有Memory引擎支持,使用场景简单;
R-tree索引(空间索引):空间索引是MyISAM的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少,不做特殊介绍;
Full-text(全文索引):全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,INnoDB从MySQL5.6版本开始提供对全文索引的支持;

索引 MyISAM引擎 MyISAM引擎 MyISAM引擎
B-Tree索引 支持 支持 支持
HASH索引 不支持 不支持 支持
R-tree索引 支持 不支持 不支持
Full-text 支持 暂不支持 不支持
 MySQL中如何使用索引(B-tree):
 1,MySQL中能够使用索引的典型场景
      1,匹配全值,对索引中所有值都列出指定具体值,即是对索引中的所有列都有等值匹配的条件(对于复合索引所有where条件都存在值);
      2,匹配值的范围查询,对索引的值能够进行范围查找;
      3,匹配最左前缀,仅仅使用索引中的最左列进行查找(where条件中了col1,col1+col2,col1+col2+col3不可col2+col3);
      4,仅仅对索引进行查询,当查询的列都在索引的字段中时,查询的效率更高;
      5,匹配前缀列,仅仅使用索引中的第一列,并且只包含索引第一列的开头一部分进行查找;
      6,能够实现索引匹配部分精确而其他部分进行范围匹配;
      7,如果列名是索引,那么使用column_name is null就会使用索引;
      8,MySQL5.6引入了Index Condition Pushdown(ICP)的特性,进一步优化了查询。Pushdown表示操作下放,某些情况下的条件过滤操作下放到存储引擎;
 2,存在索引但不能使用索引的典型场景
      1,以%开头的like查询不能够利用B-Tree索引;
      2,数据类型出现隐式转换的时候也不会使用索引,特别是当列类型是字符串,那么一定记得在where条件中把字符常量用引号引起来,否则即使这个列上有索引,MySQL也不会用到,因为MySQL默认把输入的常量进行转换以后才进行检索。
      3,复合索引的情况下,假如查询条件不包含索引列最左边部分,即不满足最左原则,是不会使用复合索引的。
      4,如果MySQL估计使用索引比全表扫描更慢,则不使用索引;
      5,用OR分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
 3,查看索引使用情况【P284】
两个简单实用的优化方法【表】
      1,定期分析表和检查表
      MySQL 的在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示某个索引对应的列包含多少个不同的值——如果cardinality大大少于数据的实际散列程度,那么索引就基本失效了。

我们可以使用SHOW INDEX语句来查看索引的散列程度。CARDINALITY大大少于数据量,因此这个索引基本起不到作用
analyze table 表名【本语句用于分析和存储表的关键字分布。在分析期间,使用一个读取锁定对表进行锁定。这对于MyISAM, BDB和InnoDB表有作用】
2,check table 表名
检查一个或多个表是否有错误,check table 对MyISAM和InnoDB表有作用,也可以检查视图是否有错误,比如在视图定义中被引用的表已不存在

你可能感兴趣的:(mysql)