mysql索引

索引类型

  • 普通索引
    CREATE INDEX index_mytable_name ON mytable(name);

  • 唯一索引
    索引列的值必须唯一,但允许有空值

  • 主键索引

  • 组合索引

  • 全文索引(fulltext)
    只有char、varchar,text 列上可以创建全文索引

覆盖索引

使用联合索引,查询的字段都有索引,由覆盖索引可以减少树的搜索次数,不用回表,显著提升查询性能

联合索引最左匹配原则

  • 最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
  • 索引列类型为字符串,where查询条件没有加引号,索引失效
  • 查询条件字段和联合索引是完全匹配的话,顺序不对也可以走联合索引,mysql优化器会优化
  • 查询条件字段和联合索引不是完全匹配的话,根据最左匹配原则

唯一索引和普通索引的选择(业务代码保证该字段唯一的情况下)

这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响。所以,建议尽量选择普通索引。
如果所有的更新后面,都马上伴随着对这个记录的查询,那么应该关闭 change buffer。

唯一索引不能使用change buffer, 只有普通索引可以使用change buffer
唯一索引的更新操作,要先判断这个更新是否违反唯一性约束性,要将数据页读入内存中才能判断。若数据页都在内存中,则更新内存会很快,无需使用change buffer。
而在其他情况下,change buffer 都能提升更新性能。在实际使用中,普通索引和 change buffer 的配合使用,对于数据量大的表的更新优化还是很明显的。

change buffer
  • 当需要更新一个数据页时,如果数据页在内存中就直接更新
  • 而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下:1、 InnoDB 会将这些 更新操作 缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了;2、在下次查询需要访问这个数据页的时候,将数据页读入内存;3、然后执行 change buffer 中与这个页有关的操作。

将change buffer中的操作应用到原数据页,得到最新结果的过程称为merge。
除了访问这个数据页会触发merge外,系统有后台线程会定期merge。在数据库正常关闭(shutdown)的过程中,也会执行merge操作。

change buffer 的使用场景

因为merge的时候是真正进行数据更新的时刻,而change buffer的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做merge之前,change buffer记录的变更越多(也就是这个页面上要更新的次数越多),收益就越大。
因此,change buffer适合写多读少的业务。比如说日志,账单等场景

反之,假设一个业务的更新模式是写入之后马上会做查询,那么即使满足了条件,将更新先记录在change buffer,但之后由于马上要访问这个数据页,会立即触发merge过程。这样随机访问IO的次数不会减少,反而增加了change buffer的维护代价,所以,对于这种业务模式来说,change buffer反而起到了副作用。

前缀索引

MySQL是支持前缀索引的,可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。
使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。
但是前缀索引,即使你的联合索引已经包涵了相关信息,他还是会回表,因为他不确定你到底是不是一个完整的信息。

聚簇索引和非聚簇索引

聚簇索引

聚簇索引叶子节点存储的是行数据,因此通过聚簇索引可以直接找到真正的行数据。

非聚簇索引

在非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID,所以当我们使用非聚簇索引进行查询时,首先会得到一个主键 ID,然后再使用主键 ID 去聚簇索引上找到真正的行数据,我们把这个过程称之为回表查询。

区别
  • 聚簇索引叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)。
  • 聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引
  • 聚簇索引一般为主键索引,而主键一个表中只能有一个,因此聚簇索引一个表中也只能有一个,而非聚簇索引则没有数量上的限制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值