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

mysql 收集表统计信息

基础概念

MySQL的表统计信息是数据库管理系统(DBMS)用来优化查询执行计划的重要数据。这些统计信息包括表的行数、列的唯一值数量、列的数据分布等。MySQL使用这些信息来估计查询的代价,从而选择最优的查询执行计划。

相关优势

  1. 优化查询性能:通过准确的统计信息,MySQL可以生成更高效的查询执行计划,减少不必要的磁盘I/O和CPU运算。
  2. 减少锁竞争:在某些情况下,优化器可以通过统计信息避免全表扫描,从而减少锁的使用,提高并发性能。
  3. 支持复杂查询:对于涉及多个表的连接查询,统计信息可以帮助优化器选择最佳的连接顺序和算法。

类型

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

  1. 表级别统计信息:如表的行数(rows)、数据大小(data_length)等。
  2. 列级别统计信息:如列的唯一值数量(cardinality)、平均长度(avg_length)等。
  3. 索引级别统计信息:如索引的叶节点数量、索引的高度等。

应用场景

统计信息在以下场景中尤为重要:

  1. 复杂查询优化:对于涉及多个表连接和大量数据过滤的查询,准确的统计信息可以帮助优化器生成更高效的执行计划。
  2. 大数据处理:在处理海量数据时,统计信息可以帮助减少查询时间和资源消耗。
  3. 实时数据分析:在需要快速响应的实时数据分析场景中,统计信息可以显著提高查询性能。

常见问题及解决方法

问题1:为什么查询执行计划不准确?

原因:可能是由于统计信息过时或不准确导致的。

解决方法

  1. 更新统计信息:使用ANALYZE TABLE命令来更新表的统计信息。
  2. 更新统计信息:使用ANALYZE TABLE命令来更新表的统计信息。
  3. 调整统计信息收集策略:可以通过设置innodb_stats_auto_recalc参数来自动重新计算统计信息。
  4. 调整统计信息收集策略:可以通过设置innodb_stats_auto_recalc参数来自动重新计算统计信息。

问题2:为什么某些查询仍然很慢?

原因:可能是由于统计信息不全面或不准确,导致优化器选择了不合适的执行计划。

解决方法

  1. 检查索引:确保相关的列上有适当的索引。
  2. 手动优化查询:在某些情况下,可以通过手动重写查询或使用提示(如STRAIGHT_JOIN)来强制优化器选择特定的执行计划。
  3. 手动优化查询:在某些情况下,可以通过手动重写查询或使用提示(如STRAIGHT_JOIN)来强制优化器选择特定的执行计划。

参考链接

通过以上方法和建议,可以有效管理和优化MySQL表的统计信息,从而提升数据库的整体性能。

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

相关·内容

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

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

99030
  • MySQL统计信息相关表介绍

    以前给大家介绍过MySQL中的统计信息,相信大家也都了解了。那么统计信息是存放在哪里呢?我们怎么去查看?...在MySQL中提供了两个表记录统计信息的相关内容,分别是 innodb_table_stats与innodb_index_stats。下面就这两个表的内容,与大家进行一些分享。...重要的列: last_update 就是最后一次收集统计信息的时间 clustered_index_size 聚集索引的page数量 sum_of_other_index_sizes 非聚集索引的page...innodb_table_stats与innodb_index_stats两张表我们可以了解统计信息、计算索引的大小、索引的选择性如何,也可以做到监控中。...通过5.7的MySQL中添加了Sys Schema也就是让大家不用通过去查看代码的方式去排查各种问题、故障处理等,可见对系统表的学习在日后会更重要。

    2.2K80

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

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

    1.8K50

    统计信息记录表|全方位认识 mysql 系统库

    在上一期《数据库对象信息记录表|全方位认识 mysql 系统库》中,我们详细介绍了mysql系统库中的元数据记录表,本期我们将为大家带来系列第四篇《统计信息记录表|全方位认识 mysql 系统库》,下面请跟随我们一起开始...持久统计信息存储在mysql.innodb_table_stats和mysql.innodb_index_stats表中,前者存放表结构、数据行相关的统计信息,后者存放索引值相关的统计信息。...但要注意,这里说的是会触发重新计算索引统计信息,而不是表mysql.innodb_table_stats表中的表及其数据相关的统计信息,要想在添加索引时数据相关的统计信息同时更新到mysql.innodb_table_stats...统计信息是否精确可以通过SELECT DISTINCT(index_name)返回的值与mysql.innodb_index_stats持久统计信息表中提供的估计值来进行对比检查。...统计信息持久化依赖于mysql数据库下的表innodb_table_stats和innodb_index_stats,这些表在安装,升级和源代码构建过程中会自动设置。

    1.1K30

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

    然而,最近在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、由于上述情形存在因此索引监控在

    37620

    MySQL统计信息简介

    查询优化器决定SQL如何执行,依赖于数据库的统计信息,下面我们介绍MySQL 5.7中innodb统计信息的相关内容。 MySQL统计信息的存储分为两种,非持久化和持久化统计信息。...client登录4 表第一次被打开5 距上一次更新统计信息,表1/16的数据被修改 非持久化统计信息的缺点显而易见,数据库重启后如果大量表开始更新统计信息,会对实例造成很大影响,所以目前都会使用持久化统计信息...二、持久化统计信息 5.6.6开始,MySQL默认使用了持久化统计信息,即INNODB_STATS_PERSISTENT=ON,持久化统计信息保存在表mysql.innodb_table_stats和mysql.innodb_index_stats...持久化统计信息在以下情况会被自动更新: 1 INNODB_STATS_AUTO_RECALC=ON 情况下,表中10%的数据被修改2 增加新的索引 innodb_table_stats是表的统计信息,...查看t1表的统计信息,需主要关注stat_name和stat_value字段 ?

    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

    69950

    MySQL 统计信息简介

    查询优化器决定SQL如何执行,依赖于数据库的统计信息,下面我们介绍MySQL 5.7中innodb统计信息的相关内容。 MySQL统计信息的存储分为两种,非持久化和持久化统计信息。...client登录4 表第一次被打开5 距上一次更新统计信息,表1/16的数据被修改 非持久化统计信息的缺点显而易见,数据库重启后如果大量表开始更新统计信息,会对实例造成很大影响,所以目前都会使用持久化统计信息...二、持久化统计信息 5.6.6开始,MySQL默认使用了持久化统计信息,即INNODB_STATS_PERSISTENT=ON,持久化统计信息保存在表mysql.innodb_table_stats和mysql.innodb_index_stats...持久化统计信息在以下情况会被自动更新: 1 INNODB_STATS_AUTO_RECALC=ON 情况下,表中10%的数据被修改2 增加新的索引 innodb_table_stats是表的统计信息,...查看t1表的统计信息,需主要关注stat_name和stat_value字段 ?

    2.2K10

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

    概述 随着应用数据的增多和表量的增加,为了增加统计信息收集的效率,Oracle推出了并行和并发收集统计信息的方法。...并行收集统计信息(PARALLEL ) 当某个表的Size特别大时,可以通过并行的Slave进程共同工作来加快统计信息收集的效率。...并行 VS 并发 有时候可能对并行和 并发统计信息收集的概念有些混淆,下面我们通过一张表来总结对比一下并行和并发统计信息收集: ?...并发和并行执行统计信息收集组合 为了提高效率,可以使并发和并行执行统计信息收集同时有效,这种组合使用对于非常大的表和分区非常有效。...如何限定仅对一部分表进行并发统计信息收集? 在过去的咨询案件中,确实有些客户希望仅对某Schema的一部分表进行并发统计信息收集。

    1.1K40

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

    环境: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号(周四)统计信息收集失败。...这样就找到了问题,另外因为离统计信息信息自动收集关闭已有多年,目前生产环境运行平稳,所以最终决定保守处理,即:先将生产环境的自动任务都关闭,等在备库测试验证后再考虑生产环境开启自动任务。

    80520

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

    程序进行统计信息收集。...2.统计信息收集的对象为满足以下条件的表: 1)统计信息不锁定 2)没有统计信息 或者 上一次统计信息收集后,表中10%的行被更新。...3.统计信息收集的顺序如下: 1)没有统计信息的对象 2)上一次统计信息收集后变更量较多的对象 3)1)2)相同的,先收集大小比较小的对象 自动统计信息收集的动作确认 自动统计信息收集的相关动作可以通过以下视图进行查看...1.通常情况下,gather_database_stats_job_proc程序执行时,系统字典表也作为统计信息收集对象。...2.对于数据变化很大的表,建议通过锁定统计信息等方法,来避免作为自动统计信息收集的对象。 另外,针对一时表统计信息收集后也不会产生有效的信息,所以建议针对一时表采取动态统计的方法。

    1.5K10

    【YashanDB知识库】表收集统计信息默认阈值引起SQL执行效率差

    【问题分类】性能优化【关键字】统计信息,阈值,执行计划【问题描述】表新增87w数据自动收集统计信息任务没有启动导致SQL执行计划变差【问题原因分析】- CUS_REGISTER_READ 数据总量是18374074...,插入81万,统计信息失效的阈值是insert+delete+update超过所有行数的10%,没有达到统计信息收集的阈值,不会做收集。...- 统计信息没有失效,为什么插入81万的数据前后给出的执行计划不一样?由于数据库缺乏查看历史执行计划的视图,该问题并不能精准回复。...【解决/规避方法】- 对于大表需要合理设置统计信息收集的阈值- 获取SQL执行计划历史变更功能,已提相关需求```新引入需要注意的问题:GATHER_DATABASE_STATS('GATHER AUTO...', 0, 8, 'FOR ALL COLUMNS SIZE AUTO', 'AUTO', TRUE, TRUE)倒数第3个参数是AUTO,在客户场景分区表(100+个分区),会比较慢。

    6410

    「Mysql索引原理(十六)」维护索引和表-更新索引统计信息

    MySQL优化器使用的是基于成本的模型,而衡量成本的主要指标就是一个查询需要扫描多少行。如果表没有统计信息,或者统计信息不准确,优化器就很有可能做出错误的决定。...在 MySQL5.0和更新的版本中,还可以通过 FORMATION_SCHEMA. STATISTICS表很方便地查询到这些信息。...需要注意的是,如果服务器上的库表非常多,则从这里获取元数据的速度可能会非常慢,而且会给 MySQL带来额外的压力。 InnodB的统计信息值得深入研究。...InnoDB在打开某些INF0RMATION_SCHEMA表,或者使用 SHOW TABLE STATUS和SHOW INDEX,抑或在MySQL客户端开启自动补全功能的时候都会触发索引统计信息的更新。...如果想要更稳定的执行计划,并在系统重启后更快地生成这些统计信息,那么可以使用系统表来持久化这些索引统计信息。甚至还可以在不同的机器间迁移索引统计信息,这样新环境启动时就无须再收集这些数据。

    2K40

    MySQL统计信息更新小结

    另外,优化器还会结合是否使用临时表、是否排序等因素进行综合判断。针对扫描行数,实际上MySQL在真正开始执行语句之前,并不能精确地知道满足这个条件的记录有多少条。它是通过统计信息来估算记录数的。...这个统计信息就是索引的“区分度”。一个索引上不同的值越多,这个索引的区分度就越好。MySQL使用“采样统计”的方式来维护统计信息。...MySQL 统计信息更新默认情况下innodb_stats_persistent=ON,优化器的统计信息会持久化保存在mysql.innodb_table_stats和mysql.innodb_index_stats...以下几种情况,不管innodb_stats_auto_recalc是ON还是OFF,都会更新innodb_index_stats表的索引统计信息:表增加索引表增加或者删除字段innodb_table_stats...和innodb_index_stats这2个表的统计数据,其实也可以通过手动方式去修改它(直接update表数据),修改后,需要执行一下FLUSH TABLE命令更新对应的表统计信息让它加载生效.

    2.8K20

    truncate表,会将统计信息清除么?

    看见微信群有位朋友问: truncate表,会将统计信息清除么? 有些朋友回复, 数据字典信息都没有了,统计信息就清除了,所以是没有统计信息的。...truncate完统计信息还是在的,跟你10g还是11g没有关系,关键在你之前有没有收集统计信息,你之前都没有收集统计信息,last analyzed本来就是空的。...,除非执行了统计信息采集,truncate table和表和索引的统计信息,没有任何关联。...另一方面,truncate会影响表是否可以被自动采集统计信息的任务触发,mon_mods_all$会记录自上次自动统计信息收集作业完成之后,对所有目标表的insert、delete和update操作所影响的记录数...执行truncate,表的统计信息不会被删除,除非执行了统计信息采集,truncate table和表和索引的统计信息,没有任何关联,对象是否有统计信息记录,取决于是否采集过统计信息,包括手工和自动两种方法

    1.3K20
    领券