首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql手动收集统计信息

基础概念

MySQL的统计信息主要用于查询优化器(Query Optimizer)评估不同查询执行计划的成本,从而选择最优的执行计划。统计信息包括表的行数、列的唯一值数量、列的数据分布等。

相关优势

  1. 提高查询性能:准确的统计信息可以帮助查询优化器生成更优的查询计划,减少查询时间。
  2. 适应数据变化:随着数据的插入、删除和更新,统计信息可能会变得过时。手动收集统计信息可以确保优化器使用最新的数据进行决策。

类型

MySQL中的统计信息主要包括以下几种:

  1. 表统计信息:包括表的行数、数据大小等。
  2. 列统计信息:包括列的唯一值数量、平均值、标准差等。
  3. 索引统计信息:包括索引的使用情况、索引的大小等。

应用场景

  1. 复杂查询优化:对于涉及多个表连接、子查询等复杂查询,准确的统计信息尤为重要。
  2. 大数据处理:在处理大量数据时,优化器需要依赖统计信息来选择最优的执行计划。
  3. 定期维护:定期收集统计信息可以作为数据库维护的一部分,确保数据库性能稳定。

手动收集统计信息的方法

MySQL提供了ANALYZE TABLE命令来手动收集统计信息。以下是具体步骤:

代码语言:txt
复制
ANALYZE TABLE table_name;

例如,要收集名为employees的表的统计信息,可以执行以下命令:

代码语言:txt
复制
ANALYZE TABLE employees;

遇到的问题及解决方法

问题1:统计信息过时

原因:随着数据的插入、删除和更新,统计信息可能会变得过时,导致查询优化器生成不优的执行计划。

解决方法:定期执行ANALYZE TABLE命令来更新统计信息。

代码语言:txt
复制
ANALYZE TABLE employees;

问题2:统计信息收集缓慢

原因:对于非常大的表,收集统计信息可能需要较长时间,影响数据库性能。

解决方法

  1. 分区表:将大表分区,分别对每个分区收集统计信息。
  2. 并行收集:某些版本的MySQL支持并行收集统计信息,可以通过配置参数启用。
代码语言:txt
复制
SET GLOBAL innodb_stats_parallel = 4; -- 设置并行收集的线程数
ANALYZE TABLE employees;

问题3:统计信息不准确

原因:某些情况下,统计信息可能不准确,例如数据分布不均匀。

解决方法

  1. 手动调整统计信息:可以通过UPDATE STATISTICS命令手动调整统计信息。
  2. 使用插件:某些第三方插件可以提供更精确的统计信息收集功能。
代码语言:txt
复制
UPDATE STATISTICS employees;

参考链接

通过以上方法,可以有效地手动收集和管理MySQL的统计信息,从而优化查询性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Oracle并发(CONCURREMT)收集统计信息

编辑手记:从11.2开始,可以通过CONCURRENT参数,启用表或分区的并行扫描,加快统计信息收集速度。 作者简介:何剑敏 Oracle ACS华南区售后团队,首席技术工程师。...对于大表的统计信息收集,我们可以加degree参数,使得扫描大表的时候,进行并行扫描,加快扫描速度。 但是这在收集的时候,还是进行一个表一个表的扫描。并没有并发的扫描各个表。...可以通过以下语句看到你的数据库是否启用了CONCURRENT收集统计信息。...用concurrent收集统计信息,需要收集统计信息用户具有以下权限: CREATE JOB MANAGE SCHEDULER MANAGE ANY QUEUE 即使是该用户具有了dba角色,也还是需要显式授权上述权限...EBS系统应用是采用自己的并发管理器(FND_STATS)来收集统计信息,而收集统计信息用户往往是没有显式授权CREATE JOB、MANAGE SCHEDULER、MANAGE ANY QUEUE的。

1.7K50
  • 收集统计信息导致索引被监控

    然而,最近在Oracle 10.2.0.3中发现收集统计信息时导致索引也被监控,而不是用于sql查询引发的索引监控。如此这般,索引监控岂不是鸡肋?...1、基于Oracle 10g 收集统计信息索引被监控情形 scott@CNMMBO> select * from v$version where rownum<2; BANNER ---------...--再次收集统计信息 scott@CNMMBO> exec dbms_stats.gather_table_stats('SCOTT','T',cascade=>true); PL/SQL procedure...YES YES 03/22/2013 20:37:57 SQL> alter index t_pk nomonitoring usage; 3、小结   a、对于索引监控,在Oracle 10g中当收集统计信息时...,如果当前索引的统计信息也被收集则导致该索引被监控   b、注意索引能否被收集到还依赖于estimate_percent以及method_opt等收集时的相关参数   c、由于上述情形存在因此索引监控在

    37020

    MySQL统计信息简介

    查询优化器决定SQL如何执行,依赖于数据库的统计信息,下面我们介绍MySQL 5.7中innodb统计信息的相关内容。 MySQL统计信息的存储分为两种,非持久化和持久化统计信息。...一、非持久化统计信息 非持久化统计信息存储在内存里,如果数据库重启,统计信息将丢失。...二、持久化统计信息 5.6.6开始,MySQL默认使用了持久化统计信息,即INNODB_STATS_PERSISTENT=ON,持久化统计信息保存在表mysql.innodb_table_stats和mysql.innodb_index_stats...三、统计信息不准确的处理 我们查看执行计划,发现未使用正确的索引,如果是innodb_index_stats中统计信息差别较大引起,可通过以下方式处理: 1、手动更新统计信息,注意执行过程中会加读锁:...目前MySQL并没有提供直方图的功能,某些情况下(如数据分布不均)仅仅更新统计信息不一定能得到准确的执行计划,只能通过index hint的方式指定索引。

    2.6K20

    Oracle的自动统计信息收集直方图的信息

    在oracle9i中,默认的统计信息收集是不收集直方图信息的,也就是说默认的MOTHOD_OPT模式为FOR ALL COLUMNS SIZE 1 在10g开始,dbms_stats包中默认的METHOD_OPT...DBMS_STATS.GET_PARAM('METHOD_OPT') ——————————————————————– FOR ALL COLUMNS SIZE AUTO 这就说明,从10g开始,统计信息收集中的直方图部分...,收集与否是有oracle自从判断,从实际的使用来看,oracle的智能判断并不是100%正确, oracle往往会大量的收集一些并不是必须的直方图信息,而有些直方图信息又会对查询造成不必要的影响 由于我们简单的对直方图进行删除后...,oracle的自动统计信息又会重新收集,所以我们需要采取一些必要的方法,来规避这个问题 10g中: 解决方案 删除表的统计信息 手工收集标的统计信息,不收集直方图 lock表的统计信息 创建JOB手工收集统计信息...11g中 在11g中,oracle对dbms_stats包添加了新功能,提供给我们进行修改,可以使用dbms_stats.set_table_prefs包 删除直方图信息: dbms_stats.delete_column_stats

    68550

    MySQL 统计信息简介

    查询优化器决定SQL如何执行,依赖于数据库的统计信息,下面我们介绍MySQL 5.7中innodb统计信息的相关内容。 MySQL统计信息的存储分为两种,非持久化和持久化统计信息。...一、非持久化统计信息 非持久化统计信息存储在内存里,如果数据库重启,统计信息将丢失。...二、持久化统计信息 5.6.6开始,MySQL默认使用了持久化统计信息,即INNODB_STATS_PERSISTENT=ON,持久化统计信息保存在表mysql.innodb_table_stats和mysql.innodb_index_stats...三、统计信息不准确的处理 我们查看执行计划,发现未使用正确的索引,如果是innodb_index_stats中统计信息差别较大引起,可通过以下方式处理: 1、手动更新统计信息,注意执行过程中会加读锁:...目前MySQL并没有提供直方图的功能,某些情况下(如数据分布不均)仅仅更新统计信息不一定能得到准确的执行计划,只能通过index hint的方式指定索引。

    2.2K10

    知识&案例:并行和并发统计信息收集

    概述 随着应用数据的增多和表量的增加,为了增加统计信息收集的效率,Oracle推出了并行和并发收集统计信息的方法。...本文将针对并行和并发收集统计信息的相关知识内容以及部分案例进行介绍,并重点介绍并发统计信息收集。...并发收集统计信息主要使用了以下的几种技术: ? 要启用并发收集统计信息,需要设置以下的参数: ?...并发统计信息收集的监视 可以通过以下的视图,对并发统计信息收集进行监视 ?...设定相关内容,并发统计信息收集却无效? 有用户咨询,为什么我的环境中设定了并发执行统计信息收集,查看相关的视图却发现,统计信息收集时并没有并发执行?

    1.1K40

    自动统计信息收集(Automatic Optimizer Statistics Collection)

    自动统计信息收集(Automatic Optimizer Statistics Collection): 10g 从Oracle 10g版本开始,在默认设定的情况下,Oracle会通过自动维护作业,自动地收集优化器统计信息...程序进行统计信息收集。...2.统计信息收集的对象为满足以下条件的表: 1)统计信息不锁定 2)没有统计信息 或者 上一次统计信息收集后,表中10%的行被更新。...3.统计信息收集的顺序如下: 1)没有统计信息的对象 2)上一次统计信息收集后变更量较多的对象 3)1)2)相同的,先收集大小比较小的对象 自动统计信息收集的动作确认 自动统计信息收集的相关动作可以通过以下视图进行查看...2.对于数据变化很大的表,建议通过锁定统计信息等方法,来避免作为自动统计信息收集的对象。 另外,针对一时表统计信息收集后也不会产生有效的信息,所以建议针对一时表采取动态统计的方法。

    1.5K10

    统计信息自动收集任务失效原因排查

    环境:Oracle 11.2.0.3 RAC 问题:统计信息自动收集任务失效原因排查 1.查看自动任务的状态 查看自动任务的状态,确认是enabled状态: SQL> select client_name...advisor ENABLED Elapsed: 00:01:03.88 一般来说,这样的结果,就意味着统计信息自动收集是打开的...另外,看下统计信息自动收集任务的WINDOW_GROUP以及对应的MEMBER_NAME: SQL> select client_name,window_group 2 from DBA_AUTOTASK_CLIENT...Elapsed: 00:00:00.04 可以看到,正常应该是一周7天都有的,但是由于THURSDAY_WINDOW 的窗口ACTIVE是TRUE,导致2012年9月27号(周四)统计信息收集失败。...这样就找到了问题,另外因为离统计信息信息自动收集关闭已有多年,目前生产环境运行平稳,所以最终决定保守处理,即:先将生产环境的自动任务都关闭,等在备库测试验证后再考虑生产环境开启自动任务。

    78720

    MySQL统计信息更新小结

    针对扫描行数,实际上MySQL在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条。它是通过统计信息来估算记录数的。这个统计信息就是索引的“区分度”。...MySQL使用“采样统计”的方式来维护统计信息。采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。...在MySQL中,有两种存储索引统计的方式,可以通过设置参数innodb_stats_persistent的值来选择:设置为on的时候,表示统计信息会持久化存储。这时,默认的N是20,M是10。...MySQL 统计信息更新默认情况下innodb_stats_persistent=ON,优化器的统计信息会持久化保存在mysql.innodb_table_stats和mysql.innodb_index_stats...和innodb_index_stats这2个表的统计数据,其实也可以通过手动方式去修改它(直接update表数据),修改后,需要执行一下FLUSH TABLE命令更新对应的表统计信息让它加载生效.

    2.7K20

    【DB笔试面试630】在Oracle中,怎样收集表的统计信息?怎样收集分区表的统计信息

    ♣ 题目部分 在Oracle中,怎样收集表的统计信息?怎样收集分区表的统计信息?...♣ 答案部分 主要采用DBMS_STATS.GATHER_TABLE_STATS包进行统计信息收集,如下所示: DBMS_STATS.GATHER_TABLE_STATS(USER,'TB_NAME...DBMS_STATS.GATHER_TABLE_STATS(USER,'TB_NAME',PARTNAME=>'PT_PART_NAME',GRANULARITY=>'PARTITION',CASCADE=>TRUE);--针对分区表的单个分区进行收集统计信息...除此之外,还有一些其它的用法,如下所示: l EXEC DBMS_STATS.GATHER_DATABASE_STATS();--收集当前数据库下所有用户的统计信息 l EXEC DBMS_STATS.GATHER_SCHEMA_STATS...(USER);--收集用户下所有对象的统计信息 当系统的分区表数据量很大时,如果每次都收集全部的分区必然会导致统计信息收集非常慢,在Oracle 11g之后可以通过设置INCREMENTAL来只针对数据有变动的分区做收集

    98630

    Oracle 12c数据库优化器统计信息收集的最佳实践(三)|何时不需要收集统计信息

    如果你依赖于自动收集统计信息job来维护这类表的统计信息,那么统计信息会经常显示此表为空。因为晚上此表是空的,而收集统计信息的job也正是晚上才开始执行。...在这种情况下,最好在表被填充时收集一组有的代表性的统计信息,并锁住。锁住统计信息会阻止自动收集统计信息覆盖他们。另外,你可以依赖于动态采样来收集这些表的统计信息。...在这种情况下收集统计信息的成本大于好处,因为统计信息只被使用一次。反倒是动态采样应该用于这些场景。建议你锁住这些中间表上的统计信息以防止自动统计信息收集任务再次对他们收集统计信息。...强烈建议你允许自动统计信息收集任务来维护数据字典统计信息,即使你关掉主要应用账户上的自动统计信息收集job。...这些默认值可能没有代表性,可能会导致非最优的执行计划,这可能会导致严重的性能问题,正是因为这个原因,我们强烈建议你手动收集内部对象统计信息

    1.2K50

    MySQL字段信息统计机制场景

    信息更新的基本逻辑 默认情况下,MySQL 会高效地从 系统表 mysql.index_stats 和 mysql.table_stats 中检索这些列的缓存值,而不是直接从存储引擎中获取统计信息。...如果缓存的统计信息不可用或已过期,MySQL 将从存储引擎中检索最新的统计信息,并将其统计信息更新并缓存在 mysql.index_stats 和 mysql.table_stats 字典表中。...值得注意的是:MySQL 重新启动或第一次打开 mysql.index_stats 和 mysql.table_stats 表不会自动更新缓存的统计信息。...TABLES.MAX_DATA_LENGTH TABLES.TABLE_ROWS TABLES.UPDATE_TIME 参数 information_schema_stats_expiry 的值决定再次收集表的统计信息的时间间隔...在以下情况中,查询统计信息列不会在 mysql.index_stats 和 mysql.table_stats 字典表中存储或更新统计信息: 缓存的统计信息尚未过期时。

    34830

    关于Oracle开启自动收集统计信息的SPA测试

    主题:关于Oracle开启自动收集统计信息的SPA测试 环境:Oracle RAC 11.2.0.4(Primary + Standby) 需求:生产Primary库由于历史原因关闭了自动统计信息收集...,目前客户需求是想要重新开启统计信息的自动收集,虽然一般来说,有了更准确的统计信息,SQL会有更好的执行计划,但由于生产环境数据复杂,实际上还是需要评估哪些SQL会因为重新开启自动统计信息收集性能反而会下降...1.构造测试环境 检查自动统计信息的开启状态: select client_name,status from dba_autotask_client; 确认自动统计信息收集是关闭的,对于“auto...: --光闭自动统计信息收集,(慎用,除非有其他手工收集统计信息的完整方案,否则不建议关闭) BEGIN DBMS_AUTO_TASK_ADMIN.disable( client_name...这里首先需要开启统计信息自动收集,并可以把自动收集的窗口时间提前到现在,减少等待的时间。

    1.1K20

    Oracle 11G统计信息自动收集及调整

    从Oracle 11G开始,数据库统计信息的自动收集被整合到自动维护任务中,满足大多数情形下的运行需求。但对于在线商城,交易系统而言,可能需要调整其执行时间或者自行指定收集窗口。...本文描述了如何查看以及调整自动收集统计时间窗口等,供大家参考。...一、缺省的统计信息相关状态查看 1、查看自动收集统计信息对应的task(也就是program的名称)及状态 --当前状态 SQL> select * from v$version...--统计信息收集的时间窗口 --如下查询周一至周五时间为22点,周六日为6点 --此外持续也不相同,周一至周五为4小时,周六日为20个小时...1、启用自动收集统计信息 BEGIN DBMS_AUTO_TASK_ADMIN.ENABLE ( client_name => '

    1.2K00
    领券