8.3.2 Primary Key Optimization 主键优化
表中的主键代表了列或者是列集合,你用它来做主要的查询。它有一个关联索引,为了快速的执行查询。查询执行的好处来自NOT NULL的优化,因为它不鞥呢包含任何Null值。通过InnoDB存储引擎,表数据被物理组织存储来做极速查询并且按照主键列排序。
如果你的表是一个重要而且数据量大的表,但没有一个明显的列或者是列集合可以用做一个主键,你可以创建一个独立的列通过主键自增来生成值作为主键。唯一的IDS能够给你关联的其他表提供指引找到正确的行,主键被作为外键使用。
因为主键作为数据库表中的一种特殊索引,也是人们使用的最多的索引,其介绍相对较少,接下来我们要说的是8.3.3 Foreign Key Optimization 外键索引的优化
----------------------------------------------
8.3.3 Foreign Key Optimization 外键索引的优化
如果表中有很多列,而且你查询许多不同列的组合,那么你可以将很少使用的列独立拆分出来一张表存储并通过复制主表中的ID列来找到相关的数据,这种方法可以有效提高效率。这么做,每一个小表能能够有一个主键去快速查找它需要的数据,并且你能查询只是你要的列通过使用连接操作。
关键看你怎么拆分数据,查询可以通过很少的I/O和花费更少的内存,因为关联的列被一起打包到一个磁盘。(为了最大化查询性能,查询试着读取更少的磁盘数据块;表中只用很少的列能够匹配更多的行在每一个数据块中)。
----------------------------------------------
8.3.4 Column Indexes 列索引
大多数常用类型索引涉及到的都是单一列,将数据列的复制并存在到一个数据结构中,通过快速扫描列值来获得行值。
B-tree索引数据结构能够使的索引快速的找到一个特别的值,一个值集或者是一个范围的值,对应的操作有=,>, ≤, BETWEEN, IN, 等等,在where 条件中。
每张表中最大的索引数量和最大的索引长度由存储引擎来决定。具体请看14章的InnoDB存储引擎和15章的相关存储引擎。所有的引擎支持每张表中至少可以有16个索引,而且索引长度至少可以是256bytes。大多数引擎有更高的限制。
更多详情关于列索引,请看13.1.14的创建索引的语法。
>前缀索引
>完整索引
>空间索引
>内存存储引擎中的索引
前缀索引
通过col_name(N)的语法在一个字符串类型的列上创建索引,你可以只用列中的前N个字符来完成索引的创建。只通过列值的前缀部分来索引可以使得索引文件变的非常小。当你的索引是一个BLOB或者是TEXT列时,你必须规定一个前缀长度的索引。例如:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
前缀能够长达1000bytes (对于innoDB表是767bytes,除非你有innodb_large_prefix集合).
注意:前缀限制是以字节为测量单位,前缀长度在CREATE TABLE,ALTER TABLE,和CREATE INDEX语句中可以理解为非二级制字符类型(CHAR,VARCHAR,TEXT)的字符个数,而二级制字符类型(BINARY,VARBINARY,BLOB)的字节个数。考虑到这一点,当创建一个非二进制类型的前缀索引在创建时,特别是使用多字符集合的时候。
更多信息关于前缀索引,请看13.1.14的创建索引的语法
全文索引(完整索引)
FULLTEXT索引在使用的时候是根据完整的文本来查找的。只有InnoDB和MyISAM存储引擎支持FULLTEXT索引并且只有列类型为CHAR,VARCHAR,和TEXT的可以。索引总是发生在整个列上,并且前缀列的索引不支持。更多详情,请看12.9的完整文本查找函数。
优化引用在确定种类的FULLTEXT查询对单一张表。查询的这些特性会特别影响:
1)FULLTEXT 查询只返回文本ID,或者文本ID和搜索排名。
2)FULLTEXT 查询排序根据匹配的行的分数的递减来排序,并通过LIMIT条件找最上面的N行数据。对于这些优化的使用,必须是没有where条件,并且只有单一的ORDER BY条件是递减顺序。
3)FULLTEXT 查询只要count(*)的值来自匹配上的行,没有额外的where条件。将where条件作为WHERE MATCH(text) AGAINST ('other_text'),没有any>0的对比操作。
对于包含full-text表达式的查询,mysql评估这些表达式通过优化查询计划中的优化方面。优化器不只是查询一个full-text 表达式并做出评估,它实际上苹果它们在一个执行计划的过程中。
这种行为的含义是EXPLAIN对全内容查询是会比没非全内容的查询要慢一些,因为优化阶段不会有表达式评估发生。
EXPLAIN对于full-text查询也许展示Select tables optimized away 在Extra列,因为匹配的发生是通过优化操作;在这种情况下,在后期不再需要访问表。
空间索引
你能创建一个索引在空间数据类型。MyISAM和InnoDB支持R-tree索引在空间类型。其他存储引擎使用B-tree来存储空间类型的索引(除了归档,其不支持该类型的索引)。
索引在内存存储引擎中
内存存储引擎默认使用哈希索引,但是也支持BTREE索引。
到此关于列索引的介绍就结束了,接下来我们要说明的是8.3.5的多列索引。
表中的主键代表了列或者是列集合,你用它来做主要的查询。它有一个关联索引,为了快速的执行查询。查询执行的好处来自NOT NULL的优化,因为它不鞥呢包含任何Null值。通过InnoDB存储引擎,表数据被物理组织存储来做极速查询并且按照主键列排序。
如果你的表是一个重要而且数据量大的表,但没有一个明显的列或者是列集合可以用做一个主键,你可以创建一个独立的列通过主键自增来生成值作为主键。唯一的IDS能够给你关联的其他表提供指引找到正确的行,主键被作为外键使用。
因为主键作为数据库表中的一种特殊索引,也是人们使用的最多的索引,其介绍相对较少,接下来我们要说的是8.3.3 Foreign Key Optimization 外键索引的优化
----------------------------------------------
8.3.3 Foreign Key Optimization 外键索引的优化
如果表中有很多列,而且你查询许多不同列的组合,那么你可以将很少使用的列独立拆分出来一张表存储并通过复制主表中的ID列来找到相关的数据,这种方法可以有效提高效率。这么做,每一个小表能能够有一个主键去快速查找它需要的数据,并且你能查询只是你要的列通过使用连接操作。
关键看你怎么拆分数据,查询可以通过很少的I/O和花费更少的内存,因为关联的列被一起打包到一个磁盘。(为了最大化查询性能,查询试着读取更少的磁盘数据块;表中只用很少的列能够匹配更多的行在每一个数据块中)。
----------------------------------------------
8.3.4 Column Indexes 列索引
大多数常用类型索引涉及到的都是单一列,将数据列的复制并存在到一个数据结构中,通过快速扫描列值来获得行值。
B-tree索引数据结构能够使的索引快速的找到一个特别的值,一个值集或者是一个范围的值,对应的操作有=,>, ≤, BETWEEN, IN, 等等,在where 条件中。
每张表中最大的索引数量和最大的索引长度由存储引擎来决定。具体请看14章的InnoDB存储引擎和15章的相关存储引擎。所有的引擎支持每张表中至少可以有16个索引,而且索引长度至少可以是256bytes。大多数引擎有更高的限制。
更多详情关于列索引,请看13.1.14的创建索引的语法。
>前缀索引
>完整索引
>空间索引
>内存存储引擎中的索引
前缀索引
通过col_name(N)的语法在一个字符串类型的列上创建索引,你可以只用列中的前N个字符来完成索引的创建。只通过列值的前缀部分来索引可以使得索引文件变的非常小。当你的索引是一个BLOB或者是TEXT列时,你必须规定一个前缀长度的索引。例如:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
前缀能够长达1000bytes (对于innoDB表是767bytes,除非你有innodb_large_prefix集合).
注意:前缀限制是以字节为测量单位,前缀长度在CREATE TABLE,ALTER TABLE,和CREATE INDEX语句中可以理解为非二级制字符类型(CHAR,VARCHAR,TEXT)的字符个数,而二级制字符类型(BINARY,VARBINARY,BLOB)的字节个数。考虑到这一点,当创建一个非二进制类型的前缀索引在创建时,特别是使用多字符集合的时候。
更多信息关于前缀索引,请看13.1.14的创建索引的语法
全文索引(完整索引)
FULLTEXT索引在使用的时候是根据完整的文本来查找的。只有InnoDB和MyISAM存储引擎支持FULLTEXT索引并且只有列类型为CHAR,VARCHAR,和TEXT的可以。索引总是发生在整个列上,并且前缀列的索引不支持。更多详情,请看12.9的完整文本查找函数。
优化引用在确定种类的FULLTEXT查询对单一张表。查询的这些特性会特别影响:
1)FULLTEXT 查询只返回文本ID,或者文本ID和搜索排名。
2)FULLTEXT 查询排序根据匹配的行的分数的递减来排序,并通过LIMIT条件找最上面的N行数据。对于这些优化的使用,必须是没有where条件,并且只有单一的ORDER BY条件是递减顺序。
3)FULLTEXT 查询只要count(*)的值来自匹配上的行,没有额外的where条件。将where条件作为WHERE MATCH(text) AGAINST ('other_text'),没有any>0的对比操作。
对于包含full-text表达式的查询,mysql评估这些表达式通过优化查询计划中的优化方面。优化器不只是查询一个full-text 表达式并做出评估,它实际上苹果它们在一个执行计划的过程中。
这种行为的含义是EXPLAIN对全内容查询是会比没非全内容的查询要慢一些,因为优化阶段不会有表达式评估发生。
EXPLAIN对于full-text查询也许展示Select tables optimized away 在Extra列,因为匹配的发生是通过优化操作;在这种情况下,在后期不再需要访问表。
空间索引
你能创建一个索引在空间数据类型。MyISAM和InnoDB支持R-tree索引在空间类型。其他存储引擎使用B-tree来存储空间类型的索引(除了归档,其不支持该类型的索引)。
索引在内存存储引擎中
内存存储引擎默认使用哈希索引,但是也支持BTREE索引。
到此关于列索引的介绍就结束了,接下来我们要说明的是8.3.5的多列索引。