8.3.1 How MySQL Uses Indexes MySQL 如何使用索引

8.3.1 How MySQL Uses Indexes MySQL 如何使用索引

8.3.2 Using Primary Keys 使用主键

8.3.3 Using Foreign Keys 使用外键

8.3.4 Column Indexes 单列索引

8.3.5 Multiple-Column Indexes 多列索引

8.3.6 Verifying Index Usage 校验Index 使用率

8.3.7 InnoDB and MyISAM Index Statistics Collection
8.3.8 Comparison of B-Tree and Hash Indexes

最好的方式提高SELECT 操作的性能是创建索引在一列或者多列上,

index entries 作为指针指向表记录,允许查询快速的定位那些记录匹配WHERE 条件,

并检索其他列值。所有的MySQL 的数据类型可以被索引:

尽管它可以为查询中使用的每个可能的列创建一个索引,不必要的索引访问空间,

浪费时间对于MySQL 决定哪个索引来使用。Indexes 也会增加插入,更新,和删除的成本,

因为每个索引必须被更新。你必须找到正确的平衡来完成更快的查询使用索引。

8.3.1 How MySQL Uses Indexes

索引是用于快速找到指定列值的记录。没有索引,MySQL 必须从第一条记录开始,

读取整个表来找到相关的记录。 表越大,成本越高。

如果表在查询列上有索引,MySQL 可以快速的确定搜素的position 到数据文件的中部 不需要查询所有的数据。

大多数MySQL indexes(PRIMARY LEY,UNIQUE,INDEX和FULLTEXT) 是存储在B-trees里。

例外, 用于空间数据类型使用R-trees, MEMORY tables 也支持hash indexes,

InnoDB 使用 inverted lists for FULLTEXT indexes.

在一般情况下, indexes 是用于描述下面的章节:

MySQL 使用索引用于下面操作:

1.快速找到匹配WHERE 语句的记录

2.从考虑上消除行,如果这里有一个选择在多个索引之间, MySQL 通常使用index 来找到做小的记录行

3.如果一个表有多个列索引, 任何最左前缀的索引可以用于查找记录。

比如,一个表有多列索引,任何前缀索引可以用于优化查询记录。

比如,如果你有3列的索引在(col1,col2,col3) 。你有索引搜寻能力在(col1),(col1, col2), and (col1, col2, col3).

当执行关联时从其他表检索记录,MySQL 可以使用使用索引列,如果它们是声明为相同的类型和尺寸。

在这种环境下,VARCHAR and CHAR 被认为是相同的如果它们被定义为相同的

For example, VARCHAR(10) and CHAR(10)是相同的尺寸,but VARCHAR(10) and CHAR(15) are not.

在非2进制列之间的比较,所有的列都必须使用相同的字符集。

比如,比较utf8列和一个latin 1列

比较不同的列(比较一个字符串和一个时间的或者数字列)

可能阻止索引的使用,如果值不能直接比较,在不转换的情况下。

对于一个给定的值比如1 在数字列,它可能用于比较任何数字在字符串列 比如’1’, ’ 1’, ‘00001’, or ‘01.e1’.

来找到MIN() 或者MAX() 值用于一个特定的索引列key_col.

这个是通过一个预先处理,检查你是否使用 WHERE key_part_N = constant 在所有的key部分

在这种情况下,MySQL 做一个单独的key 查找对于每个 MIN() or MAX() 表达式

替换为一个常值。 如果所有的表达式可以用常值替换,查询立即返回。如下:

SELECT MIN(key_part2),MAX(key_part2)
FROM tbl_name WHERE key_part1=10;

排序或者group 一个表如果排序或者分组是在最左端前缀索引 比如, ORDER BY key_part1, key_part2

如果 所有的Key部分是跟着DESC, key被以相反的顺序读取

在某些情况下, 一个查询可以用于优化来检索值 在不需要访问表数据记录

(一个索引提供了所有需要的结果对于一个查询被称为是covering index.)

如果一个查询使用从一个表的一个列,包括在一些索引里,选择的值可以从索引树检索记录来提高速度。

SELECT key_part3 FROM tbl_name
WHERE key_part1=1

索引在小表上是不重要的,或者大表 报表查询处理几乎所有的记录。

当一个查询需要访问大多数行,按顺序读取是快于索引访问。顺序读取会最大程序的降低磁盘查找,

即使不是所有的记录是需要的。

原文地址:https://www.cnblogs.com/hzcya1995/p/13351270.html