首页 > 数据库 >mysql 索引优化

mysql 索引优化

时间:2023-12-06 09:33:35浏览次数:39  
标签:mysql 使用 value 查询 索引 Handler MySQL 优化

 

MySQL索引优化是提高数据库性能的关键步骤之一。下面是一些建议,以帮助你优化MySQL索引:

    最左前缀原则:确保查询条件使用了索引的最左侧列。如果查询没有涵盖索引的最左侧列,索引将不会被使用。
    选择性原则:具有高选择性的索引(即返回结果集中较小部分的索引)通常更有效。使用具有唯一值的列作为索引键可以提高选择性。
    适度的索引数量:不要过度索引表,因为每个额外的索引都会增加插入、更新和删除操作的开销。只为经常用于查询条件的列创建索引。
    短索引:尽量使用较短的索引,因为它们占用的存储空间更少,并且查询效率更高。如果可能,使用前缀索引来减少索引的大小。
    复合索引:如果查询条件经常同时使用多个列,考虑创建一个复合索引来覆盖这些列。复合索引可以提高查询性能,但需要注意列的顺序和最左前缀原则。
    定期维护索引:使用OPTIMIZE TABLE命令定期重建表和索引,以消除碎片并提高性能。此操作通常在大量删除或更新操作后进行。
    避免在索引列上进行计算:尽量避免在查询中对索引列进行计算或函数操作,这会导致索引失效。如果必须进行计算,考虑将计算结果存储在一个单独的列中,并对该列进行索引。
    监控索引使用情况:使用SHOW INDEX命令定期检查索引的使用情况,并根据需要进行调整。可以删除不再使用的索引或根据查询模式添加新的索引。
    使用覆盖索引:如果查询只需要从索引中获取信息,而不需要访问实际的表数据,那么可以使用覆盖索引来提高性能。确保查询中使用的所有列都包含在索引中。
    限制结果集大小:使用LIMIT子句限制结果集的大小,以减少不必要的数据扫描和传输开销。

请注意,索引优化是一个持续的过程,需要根据实际的查询模式和数据变化进行调整。在进行任何重大更改之前,请确保在生产环境之外进行充分的测试和评估。

 

"回表"是数据库查询优化中的一个术语,主要用在使用索引进行查询的过程中。当你在MySQL中使用覆盖索引进行查询时,查询优化器通常会尝试只通过索引来获取所需的数据,以提高查询性能。
然而,在某些情况下,查询优化器可能需要再次访问原始数据表来获取其他未包含在索引中的列的数据,这个过程被称为"回表"。 举个例子,假设你有一个用户表(user),其中有id、name、age和address四个字段,并且在age字段上有一个索引。
如果你执行一个查询,要获取所有年龄大于30岁的用户的name和address,那么MySQL可能会先通过age索引找到所有年龄大于30岁的用户,
但是由于name和address字段不在age索引中,所以MySQL需要再次访问用户表,根据id获取对应的name和address,这个过程就叫做"回表"。 回表操作会增加查询的复杂性和开销,因此在设计索引时,应尽量使索引覆盖查询所需的所有字段,避免回表操作。这可以通过创建复合索引来实现,
复合索引包含了查询中需要使用的多个字段。在上面的例子中,如果你在(age, name, address)上创建复合索引,那么查询就可以只通过索引来完成,无需回表。

 

"索引覆盖"(Covering Index)是数据库优化中的一个概念,特别是在MySQL等关系型数据库中。它描述了一个索引包含了查询所需的所有数据,
而无需再次访问实际的数据表。换句话说,数据库引擎可以只通过查询索引来获取所需信息,而无需“回到”原始数据表中查找其他数据。
这可以显著提高查询性能,因为索引的结构通常比完整的数据表更简单,数据访问也更快。 为了实现索引覆盖,查询中使用的所有列都必须包含在索引中。
例如,假设你有一个用户表,其中包含id、name和age字段,并且你在(id, name)上有一个复合索引。
如果你执行一个查询,要求获取特定ID用户的姓名,那么数据库可以只通过查询索引来获取这些数据,因为这个索引“覆盖”了查询所需的所有列。
但是,如果你要求获取用户的年龄,那么这个索引就无法覆盖查询,因为age字段不在索引中,数据库需要回到原始数据表中获取这个信息。 设计索引时考虑到覆盖索引可以显著提高查询性能。为了最大程度地利用覆盖索引,你应该分析你的查询模式,并创建能够覆盖这些查询的索引。
这通常意味着你需要在经常用于查询条件的列以及查询结果中需要的列上创建复合索引。

 

MySQL中的"最左匹配"原则是关于索引使用的规则。它描述了在复合索引(包含多个列的索引)中,查询条件如何使用索引的情况。

最左匹配原则意味着,查询条件必须使用索引的最左侧列,才能使索引有效。换句话说,如果查询没有涵盖索引的最左侧列,即使它包含了索引的其他列,索引也不会被使用。

举个例子,假设你有一个复合索引包含了(col1, col2, col3)三个列。根据最左匹配原则,以下几种查询条件是可以使用这个索引的:

    WHERE col1 = 'value'
    WHERE col1 = 'value' AND col2 = 'value'
    WHERE col1 = 'value' AND col2 = 'value' AND col3 = 'value'

然而,以下查询条件则无法使用这个索引:

    WHERE col2 = 'value'
    WHERE col2 = 'value' AND col3 = 'value'
    WHERE col3 = 'value'

这是因为它们没有包含索引的最左侧列(col1)。

最左匹配原则对于设计高效的索引和查询非常重要。你应该根据查询模式选择正确的列来创建复合索引,确保查询条件能够充分利用索引,提高查询性能。
同时,也要注意避免创建过多的索引,因为每个额外的索引都会增加数据库维护的开销。

 

MySQL的“索引下推”(Index Condition Pushdown,简称ICP)是一种优化技术,用于提高查询性能。它是在MySQL 5.6及更高版本中引入的。

在传统的查询处理中,当使用索引进行查询时,MySQL会先从索引中检索出符合条件的行的位置,然后再根据这些位置回到原始数据表中获取完整的数据行。
这个过程可能会涉及到一些不必要的行数据的检索,尤其是在使用复合索引和复杂查询条件时。 而索引下推优化技术改变了这个过程。它允许MySQL在使用索引检索行的过程中,同时将查询条件推送到索引层级进行过滤。
换句话说,MySQL可以在检索索引的同时评估查询条件,只有当索引中的值满足查询条件时,才会回到原始数据表中获取完整的数据行。 这种优化可以减少不必要的数据行检索,从而提高查询性能。尤其是在处理大量数据时,索引下推可以显著减少磁盘I/O操作和CPU开销。 举个例子,假设你有一个用户表,并在(age, name)列上有一个复合索引。如果你执行一个查询,要求找出所有年龄大于30岁的用户,并且名字以“John”开头。
在没有索引下推的情况下,MySQL可能会先从索引中找到所有年龄大于30岁的用户,然后再回到数据表中获取这些用户的名字进行过滤。
而在有索引下推的情况下,MySQL可以在检索索引的同时评估名字条件,只有当索引中的值同时满足年龄和名字条件时,才会回到数据表中获取完整的数据行。 需要注意的是,索引下推并不总是能够提供性能提升。它的效果取决于查询模式、数据分布和索引设计等因素。
因此,在使用索引下推之前,你应该仔细分析和测试你的查询性能,以确定是否适合使用这种优化技术。

 

在MySQL中,执行SHOW STATUS LIKE 'Handler%'命令可以显示与数据库处理程序相关的各种状态变量。这些状态变量提供了有关数据库服务器操作的统计信息,有助于监控和性能调优。

下面是SHOW STATUS LIKE 'Handler%'命令返回的一些常见状态变量及其含义:

    Handler_commit: 显示已经提交的事务数量。
    Handler_delete: 显示已经删除的行数。
    Handler_discover: 显示MySQL服务器启动后,存储引擎通过处理程序发现的表的数量。
    Handler_external_lock: 显示存储引擎请求外部锁定的次数。
    Handler_mrr_init: 显示使用多范围读取(MRR)初始化的次数。
    Handler_read_first: 显示执行表扫描或索引扫描时读取第一行的次数。
    Handler_read_key: 显示根据键值读取行的次数。
    Handler_read_next: 显示通过索引按顺序读取下一行的次数。
    Handler_read_prev: 显示通过索引按逆序读取上一行的次数。
    Handler_read_rnd: 显示执行随机读取时读取的行数。
    Handler_read_rnd_next: 显示执行表扫描时按顺序读取下一行的次数。
    Handler_rollback: 显示已经回滚的事务数量。
    Handler_update: 显示已经更新的行数。
    Handler_write: 显示已经插入的行数。

这些状态变量可以帮助你了解数据库的工作负载和性能特征,从而进行相应的优化和调整。
例如,如果Handler_read_rnd的值非常高,可能意味着有很多随机读取操作,你可能需要考虑优化查询或增加缓存来提高性能。

 

标签:mysql,使用,value,查询,索引,Handler,MySQL,优化
From: https://www.cnblogs.com/CoreXin/p/17878815.html

相关文章

  • 使用技巧 | 红米 Redmi Note 12 Turbo优化记录(去广告等)
    原文链接:https://engapi.com/article/7569原文也是我写的。我的红米Redminote8pro6+128已有些卡顿,遂在K70推出之际下单了RedmiNote12Turbo16+1T当备机。以下记录红米Note12Turbo去广告和优化过程,小米/红米系列都可参考。1.去广告系统设置参考这里:小米/红米手机如何......
  • MySQL 优化
     以下是SQL查询的典型执行顺序:FROM和JOIN这里确定了要从哪些表中查询数据以及如何进行表之间的连接。WHERE过滤出不符合条件的记录。GROUPBY将来自多个记录的数据值分组为一个数据集或根据某些条件进行分组。HAVING在GROUPBY之后对分组进行过滤......
  • Docker部署MySQL
    一、简介MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。二、搭建MySQL绿联DX4600......
  • docker创建mysql集群
    一、创建mysql的节点目录#创建第一个节点mkdir/home/mysql-cluster/node1cd/home/mysql-cluster/node1mkdirconfdatafileslog#创建第二个节点mkdir/home/mysql-cluster/node2cd/home/mysql-cluster/node2mkdirconfdatafileslog#创建第三个节点mkdir/ho......
  • 大数据实验——mysql服务的启动
    黑马程序的mysql服务启动密码是hadoop直接在主控制台上输出mysql-uroot-p然后输入密码进入mysql服务 剩下的就是在finallshell里面进行一些建表增删改查操作,还有一个问题就是通过java代码进行对表数据的增删改查我才用的方法是在Navicat里面建一个node1主机的链接然后就......
  • MySQL EXPLAIN详解
    MySQL数据库是许多Web应用程序的底层支持,而查询性能的优化是确保系统高效运行的关键。在MySQL中,EXPLAIN是一项强大的工具,可帮助开发者深入了解查询语句的执行计划,从而更好地优化查询性能。本文将详细解析MySQL的EXPLAIN关键字,以揭开查询执行计划的面纱。什么是EXPLAIN?mysql官网......
  • 解读JetBrains 2023年开发者生态报告,MySQL仍是全球数据库顶流 | StoneDB数据库观察 #1
    :::hljs-center:::<br>:::hljs-right作者:宇亭:::<br>最近,全球知名的开发者工具公司JetBrains对外发布了《2023年开发者生态系统报告》,报告的具体内容,前几天已经有中文互联网的媒体解读了,由于我们是做数据库的,所以自然而然想要特别关注一下数据库的情况——结果在意料之......
  • 武汉星起航:亚马逊卖家苦恼的运营难题,怎样优化流程上架产品
    在亚马逊平台运营的激烈竞争中,卖家们频频面对的挑战之一是确保产品及时上架。然而,由于多种原因,卖家常常遭遇上架速度缓慢的问题,这使得商品无法迅速亮相市场。在追求即时上新的道路上,卖家们面对着种种障碍,如平台审核、产品信息不完善、图文素材质量等问题。为了应对这些挑战,卖家需要......
  • 智慧校园:TSINGSEE青犀智能视频监控,AI助力优化校园管理
    随着科技的飞速发展和信息化社会的到来,智慧校园已经成为教育领域的一种新型发展模式。智慧校园的需求和发展趋势日益显现,其建设已成为当今教育信息化发展的重要方向。TSINGSEE青犀结合高可靠、高性能的云计算、人工智能、大数据、物联网等技术,以视频云平台+校园业务系统+AI智能边缘......
  • hadoop优化之yarn调优
    yarn.nodemanager.resource.memory-mb(重点)表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。假如服务器内存64G,设置32G。yarn.nodemanager.vmem-pmem-ratio任务每使用1MB物理内存,最......