mysql-innodb-索引

聚集索引

主键索引 的InnoDB术语 。 表存储是基于主键列的值组织的,以加快涉及主键列的查询和排序。为了获得最佳性能,请根据对性能要求最严格的查询仔细选择主键列。因为修改聚集索引的列是一项昂贵的操作,所以请选择很少更新或永远不会更新的主列。
在Oracle数据库产品中,这种类型的表称为索引组织表。
每个InnoDB表都有一个特殊的索引,称为聚簇索引 ,用于存储行数据。通常,聚簇索引与主键同义 。为了从查询,插入和其他数据库操作中获得最佳性能,您必须了解如何InnoDB使用聚簇索引为每个表优化最常见的查找和DML操作。

在PRIMARY KEY表上定义a 时,InnoDB将其用作聚簇索引。为您创建的每个表定义一个主键。如果没有逻辑唯一且非空的列或列集,请添加一个新的 自动递增 列,其值将自动填充。

如果您没有PRIMARY KEY为表定义,MySQL会UNIQUE在所有键列所在的位置找到第一个索引,NOT NULL并将 InnoDB其用作聚集索引。

如果表没有索引PRIMARY KEY或UNIQUE索引不适当 ,则在InnoDB 内部生成一个隐藏的聚集索引GEN_CLUST_INDEX,该索引在包含行ID值的合成列上命名 。这些行由InnoDB分配给该表中各行的ID排序 。行ID是一个6字节的字段,随着插入新行而单调增加。因此,按行ID排序的行实际上在插入顺序上。

聚集索引如何加快查询

通过聚集索引访问行是快速的,因为索引搜索直接导致包含所有行数据的页面。如果表很大,则与使用不同于索引记录的页面存储行数据的存储组织相比,聚集索引体系结构通常可以节省磁盘I / O操作。

主键优化
表的主键代表您在最重要的查询中使用的一列或一组列。它具有关联的索引,可提高查询性能。查询性能可从NOT NULL优化中受益,因为它不能包含任何NULL值。使用InnoDB存储引擎,可以对表数据进行物理组织,以根据一个或多个主键列进行超快速查找和排序。

如果您的表又大又重要,但是没有明显的列或一组列用作主键,则可以创建一个单独的列,并使用自动增量值作为主键。当您使用外键联接表时,这些唯一的ID可用作指向其他表中相应行的指针。

二级索引或辅助索引

一种InnoDB 索引类型,表示表列的子集。一个InnoDB表可以具有零个,一个或多个二级索引。(与每个表都需要的聚集索引相反 InnoDB,并存储所有表列的数据。)

二级索引可用于满足仅需要索引列中的值的查询。对于更复杂的查询,可以使用它来识别表中的相关行,然后使用聚簇索引通过查找来检索这些行。

传统上,创建和删除二级索引会涉及复制InnoDB表中所有数据的大量开销 。该快速索引创建功能,使得无论CREATE INDEX和DROP INDEX报表快得多InnoDB二级指标。

除聚集索引之外的所有索引都称为 辅助索引。在中InnoDB,辅助索引中的每个记录都包含该行的主键列以及为辅助索引指定的列。 InnoDB使用此主键值在聚集索引中搜索行。

如果主键较长,则辅助索引将使用更多空间,因此具有短的主键是有利的。

有关利用InnoDB 聚簇索引和二级索引的准则,请参见 第8.3节“优化和索引”

单列索引

索引的最常见类型涉及单个列,该列将来自该列的值的副本存储在数据结构中,从而允许快速查找具有相应列值的行。B树数据结构可以让索引快速查找特定值,一组值,或值的范围,对应于运营商,如=, >,≤, BETWEEN,IN,等等,一在WHERE子句。

每个存储引擎定义每个表的最大索引数和最大索引长度。请参阅 第14章,InnoDB存储引擎和 第15章,备用存储引擎。所有存储引擎每个表至少支持16个索引,并且总索引长度至少为256个字节。大多数存储引擎都有更高的限制。

多列索引

MySQL可以创建复合索引(即,多列上的索引)。一个索引最多可以包含16列。对于某些数据类型,您可以为列的前缀建立索引(请参见 第8.3.4节“列索引”)。

MySQL可以将多列索引用于测试索引中所有列的查询,或者仅测试第一列,前两列,前三列等等的查询。如果在索引定义中以正确的顺序指定列,则单个组合索引可以加快对同一表的几种查询。

多列索引可以被认为是排序数组,其行包含通过串联索引列的值而创建的值。

注意
作为复合索引的替代方法,您可以根据其他列中的信息引入一个被“ 哈希化 ”的列。如果此列较短,合理唯一并且已建立索引,则它可能比许多列上的“ 宽 ”索引要快。在MySQL中,使用此额外的列非常容易:

SELECT * FROM tbl_name
WHERE hash_col= MD5(CONCAT(val1,val2))
AND col1= val1AND col2= val2;

前缀索引

使用 字符串列的索引规范中的语法,您可以创建仅使用列首字符的索引 。以这种方式仅索引列值的前缀可以使索引文件小得多。在为a 或 column 编制索引时 , 必须为索引指定前缀长度。例如: col_name(N)NBLOBTEXT

create test(blob_col BLOB,INDEX(blob_col(10)));

前缀最长可以为1000个字节(InnoDB表中为767个字节 ,除非已 innodb_large_prefix设置)。

注意
前缀限制以字节为单位,而在前缀长度CREATE TABLE, ALTER TABLE和 CREATE INDEX语句被解释为非二进制串类型的字符数(CHAR, VARCHAR, TEXT对于二进制串类型),并且字节数(BINARY, VARBINARY, BLOB)。为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑到这一点。

如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,然后检查其余行是否可能匹配。

全文索引

FULLTEXT索引用于全文搜索。只有InnoDB和 MyISAM存储引擎支持 FULLTEXT索引和仅适用于 CHAR, VARCHAR和 TEXT列。索引始终在整个列上进行,并且不支持列前缀索引。有关详细信息,请参见 第12.9节“全文搜索功能”。

优化适用于FULLTEXT针对单个InnoDB表的某些类型的 查询 。具有以下特征的查询特别有效:

FULLTEXT 仅返回文档ID或文档ID和搜索等级的查询。

FULLTEXT查询以分数的降序对匹配行进行排序,并应用一个 LIMIT子句以获取前N个匹配行。为了应用此优化,必须没有 WHERE子句,只有一个 ORDER BY子句按降序排列。

FULLTEXT仅检索COUNT(*)与搜索词匹配的行的 值的查询,没有其他WHERE 子句。将WHERE子句编码为 ,没有任何比较运算符。 WHERE MATCH(text) AGAINST (‘other_text’)> 0

对于包含全文表达式的查询,MySQL在查询执行的优化阶段评估这些表达式。优化器不仅查看全文表达式并进行估计,而且实际上在制定执行计划的过程中对其进行评估。

这种行为的含义是, EXPLAIN对于全文查询,通常比在优化阶段未进行任何表达式求值的非全文查询要慢。

EXPLAIN由于优化期间发生匹配Select tables optimized away,因此全文查询可能会显示在该Extra列中;在这种情况下,以后执行期间无需进行表访问。

空间索引

您可以在空间数据类型上创建索引。 MyISAM并InnoDB 支持有关空间类型的R树索引。其他存储引擎使用B树来索引空间类型(除外 ARCHIVE,不支持空间类型索引)。

你可能感兴趣的:(mysql)