iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 索引和数据表该如何维护
  • 766
分享到

MySQL 索引和数据表该如何维护

MySQL索引维护MySQL数据表维护 2022-05-18 18:05:37 766人浏览 泡泡鱼
摘要

目录查找和修复数据表冲突更新索引统计查找和修复数据表冲突 数据表最糟糕的事情就是发生冲突。使用MyISAM存储引擎时,通常因为崩溃导致冲突。然而,当存在硬件故障、Mysql内部Bug或操作系统Bug时,所有的存储引

目录
  • 查找和修复数据表冲突
  • 更新索引统计

查找和修复数据表冲突

数据表最糟糕的事情就是发生冲突。使用MyISAM存储引擎时,通常因为崩溃导致冲突。然而,当存在硬件故障、Mysql内部Bug或操作系统Bug时,所有的存储引擎都可能遭受索引冲突。

冲突的索引可能导致查询返回错误的结果,在没有重复值时的重复索引错误增加,甚至可能导致全表扫描或崩溃。如果你遇到过偶发的事件,例如一个你认为不会发生的错误,这个时候运行CHECK TABLE命令去检测数据表是否有冲突(注意有些数据库引擎不支持这个命令,有些则支持多种选项参数去指定如何检测表)。通常,CHECK TABLE命令会捕获大部分的数据表和索引错误。

你可以通过REPaiR TABLE命令修复数据表错误,但是也不是全部存储引擎都支持这个命令。这个时候你需要执行一个“没有操作”的ALTER语句,例如将一个数据表的引擎修改为和当前的引擎一样,例如可以对InnoDB的数据表执行下面的语句:


ALTER TABLE innodb_tb1 ENGINE=INNODB;

相应地,你也可以使用一个存储引擎指定的离线修复工具,例如myisamchk,或者导出数据再重新导入。然而,如果冲突发生在系统区,或者在数据表的数据行区域,而不是索引的话,你可能无法使用这些办法。这种情况下,你可能需要从你的备份中恢复数据或从冲突的文件中恢复数据。

如果你在InnoDB中也遇到了冲突,这会是极其严重的错误,你需要使用正确的方法去分析问题。InnoDB通常不会发生冲突。它的设计对冲突处理很健壮。冲突会是硬件故障(如内存区错误或磁盘错误),DBA的操作错误(如在mysql环境外操作了数据库文件)或InnoDB自身的Bug (这种概率很低)的表现。通常的一个原因类似视图使用rsync工具创建备份的错误。这时没有可执行的查询——由于这会引起InnoDB的数据冲突,而你认为这会避免。如果你通过一个有问题的查询引起了InnoDB的数据冲突,那这并不是你的错误,这是InnoDB的Bug。

如果真的遇到了数据冲突,最重要的事情是搞清楚引起冲突的原因,在这之前不要简单地修复数据,也许这个冲突会自动消失。你可以通过innodb_force_recovery参数将InnoDB修改为强制恢复模式来修复数据(可以查阅Mysql的操作手册)。你也可以使用开源的Percona InnoDB数据恢复工具(www.percona.com/software/my…)从损坏的数据文件中提取数据。

更新索引统计

MySQL查询优化器在决定如何使用索引前,会调用两个api获取索引值的分布。第一个是records_in_range方法,该方法接收一个范围参数,然后返回该范围的结果数量。对于MyISAM引擎来说返回结果是准确的,但是对于InnoDB来说是估计值。

第二个API是info方法,该方法返回多种类型的数据,包括索引候选者(即每个索引对应的记录数量估计值)。

当存储引擎给查询优化器提供不太准确的数据行数信息,或查询计划过于复杂而无法估计准确的行数时,优化器使用索引统计去估计数据行数。MySQL优化器是基于查询代价做出决策的,最主要的代价准则就是这次查询会查找的数据量。如果索引统计从来没有生成,或者是过期了,优化器可能会做出错误的决定。解决的方案是运行ANALYZE TABLE命令,该命令会重建索引统计。

每个存储引擎实现索引统计的方式不同,因此你运行ANALUZE TABLE命令的频率也会不同,运行该命令的代价也不同,典型的存储引擎对索引统计处理方式如下:

  • Memory引擎不存储索引统计。
  • MyISAM在磁盘存储索引统计,并且ANALYZE TABLE在计算候选数据行的时候使用全索引扫描。整个表在这个过程中会被定。
  • InnoDB在MySQL 5.5版本中不在磁盘存储索引统计,而是通过随机的索引采样实现并且将结果存在内存中。

可以通过SHOW INDEX FROM命令检查索引的候选者。例如:

这个命令给了很多索引相关的信息,可以查阅MySQL的手册了解具体细节。这里需要特别关注的是Cardinality列。该列展示了存储引擎估计的索引对应了多少个不同的值。在MySQL 5.0及更新的版本中,也可以通过INFORMATioN_SCHEMA.STATISTICS表中获取这些信息,这十分方便。例如,你可以根据INFORMATION_SCHEMA查询去找到那些低筛选性的索引。但是注意,对于数据量庞大的服务器,这些中间表可能会导致服务器的负荷大量增加。

InnoDB的统计值得深入研究。统计的结果是通过索引数据页的随机采样计算得到的,这是假设剩余未被采样到的数据也是类似的分布。在旧的InnoDB版本中,这个采样的页数是8,但最新版本的可以通过innodb_stats_sample_pages变量调整。将这个值设置为大于8有助于生成更具代表性的索引统计,尤其是对于大的数据表,但所需要花的代价也会不同。

InnoDB在数据表第一次打开,运行ANALUZE TABLE和数据表存储大小显著改变时(1/16的变化量或20亿行的插入)会计算索引统计。

INFORMATION_SCHEMA表的某些查询,运行SHOW TABLE STATUS,执行SHOW INDEX查询或MySQL命令行客户端启用了自动完成设置,InnoDB也会计算索引统计。这实际会对大数据量,或I/O速度很慢的服务器造成严重的问题。客户端程序或监控工具导致发生重新采样会导致很多锁和加重服务器负担,也会影响终端用户的启动时间。由于SHOW INDEX命令会更新索引统计,而如果你不更改的话你无法观测到索引统计。你可以通过禁用innodb_stats_on_metadata(默认是关闭的)选项去避免这些问题。下面的命令可以查出InnoDB索引统计相关的系统变量。


SHOW GLOBAL VARIABLES WHERE Variable_name like 'innodb_stats%'

如果使用的是包含了替换InnoDB的Percona XtraDB存储引擎的Percona服务器,你可以做进一步的配置。innodb_stats_auto_update选项可以让你禁止自动采样,可以有效冻结自动统计计算,除非你手动运行ANALYZE TABLE。这可以让你摆脱不稳定的查询。这个特性是基于那些大型部署系统客户的要求添加的。

为追求更高的查询计划稳定性和更快的系统启动速度,你可以使用系统级的数据表存储索引统计。这种方式在系统重启或InnoDB第一次启动打开数据表时不需要重新计算索引统计。这个特性在Percona 5.1版本已经得到支持,并且在标准的MySQL 5.6版本已经得到支持。Percona服务器这个特性是通过innodb_use_sys_stats_table选项启用的。在MySQL 5.6版本后,是通过innodb_stats_persistent选项控制的,默认是ON。同时,还有一个变量控制单表的,innodb_stats_auto_recalc变量默认为ON,会在数据表变化量超过10%时重新统计该表的索引统计(手册可以参考:dev.mysql.com/doc/refman/…)。

如果你没有配置自动更新索引统计,你需要定期使用ANALYZE TABLE命令来更新索引统计,除非你知道不更新不会导致糟糕的查询计划。

以上就是MySQL 索引和数据表该如何维护的详细内容,更多关于MySQL 索引和数据表维护的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 索引和数据表该如何维护

本文链接: https://www.lsjlt.com/news/10343.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在MySQL中维护索引和数据表
    如何在MySQL中维护索引和数据表?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。查找和修复数据表冲突数据表最糟糕的事情就是发生冲突。使用MyISAM存储引擎时,...
    99+
    2023-06-15
  • MongoDB的索引如何管理与维护
    MongoDB的索引管理与维护可以通过以下几种方式进行: 创建索引:可以使用createIndex()方法在MongoDB中创建...
    99+
    2024-05-07
    MongoDB
  • 如何使用Java快速创建和维护高效的索引数据结构?
    在现代软件开发中,数据结构是非常重要的一部分。一个好的数据结构可以使得程序在处理大量数据时更加高效,而索引数据结构则是其中的一种。在本文中,我们将会介绍如何使用Java快速创建和维护高效的索引数据结构。 一、什么是索引数据结构? 索引数据...
    99+
    2023-09-23
    索引 npm leetcode
  • MySQL如何实现表维护
    这篇文章主要介绍MySQL如何实现表维护,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!表维护为什么要做表维护操作,解决什么问题?两种情况下需要做表维护操作,一是由于服务器崩溃而导致表...
    99+
    2024-04-02
  • MySQL数据库引擎和索引
    一、MySQL 数据库引擎:1. Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的...
    99+
    2024-04-02
  • 数据库索引失效应该如何处理
    数据库索引失效可能是因为数据量增加导致索引失效,或者是索引被删除或者被修改了。以下是处理数据库索引失效的一些方法: 重新建立索引...
    99+
    2024-04-09
    数据库
  • SQL Server数据库镜像下有效的索引维护
    SQL Server数据库镜像下有效的索引维护 我们在做索引重建的时候,由于索引重建产生太多日志,习惯切换到大容量日志恢复模式。而在生产环境,我们配置了数据库镜像作为高可用,镜像只能运行于完整恢复...
    99+
    2024-04-02
  • PHP与MySQL索引的数据更新和索引维护的性能优化策略及其对性能的影响
    摘要:在PHP与MySQL的开发中,索引是优化数据库查询性能的重要工具。本文将介绍索引的基本原理和使用方法,并探讨索引对数据更新和维护的性能影响。同时,本文还提供了一些性能优化策略和具体的代码示例,帮助开发者更好地理解和应用索引。索引的基本...
    99+
    2023-10-21
    PHP 性能优化 MySQL索引 关键词:
  • MySQL数据库给表添加索引
    说明:当数据库中的记录数过多时,查询速度会显著变慢。此时可以给表创建索引,提高查询速度。 一、创建索引前 我现在有一张表,有1000万条记录,根据username值,查询一条记录,测试下查询时间; s...
    99+
    2023-09-18
    数据库 mysql 数学建模
  • 该如何进行MySQL的索引分类
    这篇文章给大家介绍该如何进行MySQL的索引分类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MySQL的索引分类问题一直让人头疼,几乎所有的资料都会给你列一个长长的清单,给你介绍什么...
    99+
    2024-04-02
  • mysql如何清除索引数据库
    今天就跟大家聊聊有关 mysql如何清除索引数据库,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。mysql如何清除索引数据库1.在DOS窗口运行 ...
    99+
    2024-04-02
  • MySQL数据库索引和事务
    目录1. 索引 1.1 概念 1.2 作用 1.3 索引的原理 1.3.1 减少磁盘的访问次数是构建索引的核心思想 1.3.2 B+ 树适用实现索引的底层 1.4 适用场景 1.5 ...
    99+
    2024-04-02
  • MySQL如何管理创建CREATE表和索引
    小编给大家分享一下MySQL如何管理创建CREATE表和索引,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!SQL语句:   数据库   表 ...
    99+
    2024-04-02
  • MySQL索引如何创建和使用索引
    创建MySQL索引可以通过以下两种方式: 使用CREATE INDEX语句创建索引: CREATE INDEX index_na...
    99+
    2024-03-06
    MySQL
  • PHP与MySQL索引的更新和维护策略及其对数据写入性能的影响
    引言:在大多数的Web应用程序中,PHP和MySQL扮演了重要角色。PHP是一种流行的服务器端脚本语言,而MySQL则是一个常用的关系型数据库管理系统。在使用PHP与MySQL进行数据操作时,索引的优化和维护策略对于提高数据库性能至关重要。...
    99+
    2023-10-21
    维护策略 写入性能 索引更新
  • 如何实现MySQL底层优化:索引的高级最佳实践和维护策略
    对于MySQL数据库的底层优化,索引的高级最佳实践和维护策略是至关重要的。通过合理地创建和维护索引,可以大大提升数据库的性能和查询效率。本文将介绍MySQL索引的高级最佳实践和维护策略,并提供具体的代码示例,帮助读者更好地掌握这一关键知识。...
    99+
    2023-11-08
    最佳实践 MySQL索引优化 数据维护策略
  • 数据库建表如何设置索引名
    在建表时,可以通过在CREATE TABLE语句中使用CREATE INDEX子句来为表添加索引。索引名的设置可以通过在CREATE INDEX子句中使用INDEX关键字后面跟随索引名的方式进行。以下是一个示例:```CREATE TA...
    99+
    2023-08-09
    数据库
  • 怎么在MySQL中构建数据表索引
    本篇文章给大家分享的是有关怎么在MySQL中构建数据表索引,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。支持多种类型的过滤现在我们需要看看哪些列的值比较分散以及哪些列在WHER...
    99+
    2023-06-15
  • 如何有效管理和维护MySQL数据库中的ibd文件
    在MySQL数据库中,每个InnoDB表都对应着一个.ibd文件,这个文件存储了表的数据和索引。因此,对于MySQL数据库的管理和维护,ibd文件的管理也显得尤为重要。本文将介绍如何有...
    99+
    2024-04-02
  • mysql如何查看表索引信息
    要查看MySQL表的索引信息,可以使用以下命令: 1、查看表的所有索引: SHOW INDEX FROM 表名; 例如,要查看名为...
    99+
    2024-04-15
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作