Mysql索引与优化-1

Mysql官网对于索引的解释是:索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与WHERE子句中的条件匹配,并检索这些行的其他列值。所有MySQL数据类型都可以索引。

索引还会增加插入,更新和删除的成本,因为每个索引都必须更新。您必须找到适当的平衡,才能使用最佳索引集来实现快速查询。可以知道索引只是对于select有利,不是万能的。所以我们聊聊怎么优化索引以达到平衡。

1、怎样使用索引
如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据,大多数MySQL索引(PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)存储在B树中。例外:空间数据类型的索引使用R树;MEMORY表还支持哈希索引。InnoDB对FULLTEXT索引使用反向列表

MySQL使用索引进行这些操作:

  • 快速查找与WHERE子句匹配的行;
  • 从考虑中消除行。如果可以在多个索引之间进行选择,则MySQL通常使用找到行最少的索引(选择性最高的索引)
  • 如果表具有多列索引,那么优化器可以使用索引的任何最左前缀来查找行。例如,如果在(col1,col2,col3)上有一个三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上具有索引搜索功能
  • 执行联接时从其他表中检索行。如果声明相同的类型和大小,MySQL可以更有效地在列上使用索引。在这种情况下,如果VARCHAR和CHAR声明为相同的大小,则认为它们相同。例如,VARCHAR(10)和CHAR(10)的大小相同,但VARCHAR(10)和CHAR(15)的大小不同。为了在非二进制字符串列之间进行比较,两个列应使用相同的字符集。例如,将utf8列与latin1列进行比较会排除使用索引。如果不能不通过转换直接比较值,则比较不同的列(例如,将字符串列与时间或数字列进行比较)可能会阻止使用索引。对于数字列中的给定值(例如1),它可能等于字符串列中的任意数量的值,例如“ 1”,“ 1”,“ 00001”或“ 01.e1”。这排除了对字符串列使用任何索引的可能性。
  • 查找特定索引列key_col的MIN()或MAX()值。
    这由预处理器优化,该预处理器检查是否在索引中在key_col之前出现的所有关键部分上使用WHERE key_part_N = constant。
    在这种情况下,MySQL对每个MIN()或MAX()表达式执行一次键查找,并将其替换为常量。如果所有表达式都用常量替换,查询将立即返回。
    例如
SELECT MIN(key_part2),MAX(key_part2)
  FROM tbl_name WHERE key_part1=10;
  • 如果排序或分组是在可用索引的最左前缀(例如,ORDER BY key_part1,key_part2)上完成的,则对表进行排序或分组。如果所有关键部分后跟DESC,则按相反顺序读取
  • 在某些情况下,可以优化查询以检索值而无需查询数据行。
    (为查询提供所有必要结果的索引称为覆盖索引。)如果查询仅从表中使用某些索引中包含的列,则可以从索引树中检索选定的值,以提高速度。如果查询仅从表中使用某些索引中包含的列,则可以从索引树中检索所选值,以提高速度
SELECT key_part3 FROM tbl_name
  WHERE key_part1=1


不是银弹:对于报表查询处理大多数或所有行的小型表或大型表,索引的重要性不那么重要。当查询需要访问大多数行时,顺序读取要比处理索引快。顺序读取可以最大程度地减少磁盘查找,即使查询不需要所有行

2、Primary Key Optimization

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

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

3、Foreign Key Optimization
如果一个表有许多列,并且您查询了许多不同的列组合,将不常用的数据拆分成单独的表(每个表包含几列),然后通过复制数字ID将它们关联回主表可能会比较有效。
主表中的列。这样,每个小表都可以具有用于快速查找其数据的主键,并且您可以使用联接操作仅查询所需的一组列。根据相关数据的分布方式,查询可能执行较少的I / O并占用较少的缓存,因为相关的列在磁盘上打包在一起。(为了最大化性能,查询尝试从磁盘读取尽可能少的数据块;只有几列的表可以在每个数据块中容纳更多的行。)

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

每个存储引擎定义每个表的最大索引数和最大索引长度。大多数存储引擎都有更高的限制。

CREATE INDEX不能用于创建主键,改用ALTER TABLE。可以为CHAR,VARCHAR,BINARY和VARBINARY键部分指定前缀索引。必须为BLOB和TEXT关键部分指定前缀。前缀限制以字节为单位。
但是,CREATE TABLE,ALTER TABLE和CREATE INDEX语句中索引规范的前缀长度被解释为非二进制字符串类型(CHAR,VARCHAR,TEXT)的字符数和二进制字符串类型(BINARY,VARBINARY,BLOB)的字节数。为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑到这一点。前缀支持和前缀长度(如果支持)取决于存储引擎。例如,InnoDB表的前缀最长可以为767个字节,如果启用了innodb_large_prefix选项,则前缀可以为3072个字节。对于MyISAM表,前缀长度限制为1000个字节。NDB存储引擎不支持前缀。

这里的索引包括普通索引,唯一索引,全文索引,空间索引。

猜你喜欢

转载自blog.csdn.net/weixin_42002747/article/details/106912408
今日推荐