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

来源:互联网 发布:印度英语知乎 编辑:程序博客网 时间:2024/05/21 11:29

8.3 Optimization and Indexes 优化和索引

8.3.1 How MySQL Uses Indexes
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
8.3.7 InnoDB and MyISAM Index Statistics Collection
8.3.8 Comparison of B-Tree and Hash Indexes

最好的方式来改善SELECT 操作的性能是创建索引在1列或者多列上,这些列用在查询里。

index entries 表现为指针指向表里的记录,允许查询快递的定位匹配WHERE 条件的记录,

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

尽管它很容易的创建一个索引为每个可能的列,

不必要的索引浪费空间和浪费时间来确定哪个索引被使用,

indexes 也增加了插入,updates和delete 因为每个索引必须被更新,你必须找到正确的平衡点来

实现快速的查询使用最佳的索引。

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

索引是用于快速查找特定列的记录。如果没有索引,

MySQL 必须从第一行开始,然后读取整个表的行来找到相关的记录。

表越大,成本越高。 如果表有一个索引对于查询的列, MySQL 能快速的确定位置

来寻找表中间的数据,而不需要寻找所有的数据。 这个比读取每一行要快很多

MySQL 大多数索引(PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT) 是存储在B-trees,

例外,索引在空间数据类型使用R-trees;内存表也支持hash 索引,

通常,索引被使用在下面的讨论中:

MySQL 使用索引用于三种操作:

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

2.消除行,如果有一个选择在多个索引里,MySQL 通常使用那个找到最小记录数的索引(最有选择性的索引)

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

如果你有一个3列索引(col1, col2, col3), 你可以搜索功能在 (col1), (col1, col2), and (col1, col2, col3).

从其他表检索数据党执行关联时, MySQL 可以使用索引在关联列上会更加有效,如果它们定义为相同的类型。

在这样的背景下,VARCHAR 和CHAR 是被认为相同。

非2进制字符列的比较, 两列应使用相同的字符集。

比较不同的列(比较一个字符串列对于一个事件的或者数字的列)

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

对于一个给定的值比如1 在数字列, 它可能比较 任何数字的 值

找到min()或者max()值对于一个页顶的索引列key_col, 这是被优化的通过预处理,

检查你是否使用WHERE key_part_N=常数在所有的key parts.在这种情况下,

MySQL 做一个单独的key 查找对于每个min(),max()表达式,用常值替换它。
SELECT MIN(key_part2),MAX(key_part2)
FROM tbl_name WHERE key_part1=10;

要排序或者group 一个表 如果排序或者汇总在最左边前缀(比如,ORDER BY key_part1, key_part2).

如果所有的key parts 是按DESC 排序,key会以相反的顺序读取。

在某些情况下,查询可以优化来检索值在不需要咨询数据行( 一个索引提供提供所有需要的结果数据对于一个查询叫做覆盖索引)

如果一个查询使用一个表的一列, 这列包含在某些索引中,选择的值可以从index tree中检索来提高速度

SELECT key_part3 FROM tbl_name
WHERE key_part1=1

0 0