MYSQL5.7 INDEXES之如何使用索引(一)

Most MySQL indexes (PRIMARY KEYUNIQUEINDEX, and FULLTEXT) are stored in B-trees. Exceptions: Indexes on spatial data types use R-trees; MEMORY tables also support hash indexesInnoDB uses inverted lists for FULLTEXT indexeshtml

B-Treenode

A tree data structure that is popular for use in database indexes. The structure is kept sorted at all times, enabling fast lookup for exact matches (equals operator) and ranges (for example, greater than, less than, and BETWEEN operators). This type of index is available for most storage engines, such as InnoDB and MyISAM.mysql

Because B-tree nodes can have many children, a B-tree is not the same as a binary tree, which is limited to 2 children per node.sql

Contrast with hash index, which is only available in the MEMORY storage engine. The MEMORY storage engine can also use B-tree indexes, and you should choose B-tree indexes for MEMORY tables if some queries use range operators.app

B树索引:能够在使用表达式中使用的对列的比较 =, >, >=, <, <=,或BETWEEN运营商。LIKE 若是to的参数LIKE是不以通配符开头的常量字符串,则索引也能够用于比较.less

哈希索引 :只能用来作相等比较,速度快。优化

MySQL使用索引进行如下操做:spa

  • WHERE快速 查找与子句匹配的行code

  • 从考虑中消除行。若是能够在多个索引之间进行选择,MySQL一般会使用找到最少行数的索引(最具 选择性的索引)。htm

  • 若是表具备多列索引,则优化器可使用索引的任何最左前缀来查找行。举例来讲,若是你有一个三列的索引 (col1, col2, col3),你有索引的搜索功能(col1), (col1, col2)以及(col1, col2, col3)有关更多信息,请参见 第8.3.5节“多列索引”

  • 执行联接时从其余表中检索行。若是声明相同的类型和大小,MySQL能够更有效地在列上使用索引。在这种状况下, VARCHAR与 CHAR被认为是相同的,若是它们被声明为相同的大小。例如, VARCHAR(10)和 CHAR(10)是相同的大小,可是 VARCHAR(10)和 CHAR(15)不是。

    对于非二进制字符串列之间的比较,两个列应使用相同的字符集。例如,将一utf8列与一 latin1进行比较会排除使用索引。

    若是没法在不进行转换的状况下直接比较值,则比较不一样的列(例如,将字符串列与时间或数字列进行比较)可能会阻止使用索引。对于给定的值,如1在数值列,它可能比较等于在字符串列,例如任何数量的值 '1'' 1', '00001',或'01.e1'这排除了对字符串列使用任何索引的可能性。

  • 查找特定索引列MIN()或 MAX()key_col这由预处理器优化,该预处理器检查您是否正在使用 索引中以前出现的全部关键部分在这种状况下,MySQL对每一个表达式或 表达式进行一次键查找,并将其替换为常量。若是全部表达式都用常量替换,查询将当即返回。例如: WHERE key_part_N =constantkey_colMIN()MAX()

    SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;
  • 若是排序或分组是在可用索引的最左前缀(例如上完成的,则对表进行排序或分组 若是全部关键部分后面都有,则按相反顺序读取密钥。请参见 第8.2.1.14节“按优化排序”和 第8.2.1.15节“按优化分组”。 ORDER BY key_part1key_part2DESC

  • 在某些状况下,能够优化查询以检索值而无需查询数据行。(为查询提供全部必要结果的索引称为 覆盖索引。)若是查询仅从表中使用某些索引中包含的列,则能够从索引树中检索所选值,以提升速度:

    SELECT key_part3 FROM tbl_name WHERE key_part1=1

对于报表查询处理大多数或全部行的小型表或大型表,索引的重要性不那么重要。当查询须要访问大多数行时,顺序读取要比处理索引快。顺序读取能够最大程度地减小磁盘查找,即便查询不须要全部行。有关详细信息请参见第8.2.1.20节“避免全表扫描”

相关文章
相关标签/搜索