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

如何在MySQL中维护索引和数据表

2023-06-15 01:06:47 767人浏览 泡泡鱼
摘要

如何在MySQL中维护索引和数据表?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。查找和修复数据表冲突数据表最糟糕的事情就是发生冲突。使用MyISAM存储引擎时,

如何在MySQL中维护索引和数据表?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

查找和修复数据表冲突

数据表最糟糕的事情就是发生冲突。使用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中维护索引和数据表

这个命令给了很多索引相关的信息,可以查阅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命令来更新索引统计,除非你知道不更新不会导致糟糕的查询计划。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

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

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

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

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

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

下载Word文档
猜你喜欢
  • 如何在MySQL中维护索引和数据表
    如何在MySQL中维护索引和数据表?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。查找和修复数据表冲突数据表最糟糕的事情就是发生冲突。使用MyISAM存储引擎时,...
    99+
    2023-06-15
  • 怎么在MySQL中构建数据表索引
    本篇文章给大家分享的是有关怎么在MySQL中构建数据表索引,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。支持多种类型的过滤现在我们需要看看哪些列的值比较分散以及哪些列在WHER...
    99+
    2023-06-15
  • 如何在Mysql数据库中使用视图、事务和索引
    今天就跟大家聊聊有关如何在Mysql数据库中使用视图、事务和索引,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。视图是对若干张基本表的引用,一张虚表,...
    99+
    2024-04-02
  • MongoDB的索引如何管理与维护
    MongoDB的索引管理与维护可以通过以下几种方式进行: 创建索引:可以使用createIndex()方法在MongoDB中创建...
    99+
    2024-05-07
    MongoDB
  • 如何使用Java快速创建和维护高效的索引数据结构?
    在现代软件开发中,数据结构是非常重要的一部分。一个好的数据结构可以使得程序在处理大量数据时更加高效,而索引数据结构则是其中的一种。在本文中,我们将会介绍如何使用Java快速创建和维护高效的索引数据结构。 一、什么是索引数据结构? 索引数据...
    99+
    2023-09-23
    索引 npm leetcode
  • MySQL如何实现表维护
    这篇文章主要介绍MySQL如何实现表维护,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!表维护为什么要做表维护操作,解决什么问题?两种情况下需要做表维护操作,一是由于服务器崩溃而导致表...
    99+
    2024-04-02
  • 如何在Python中实现二维码的索引和检索?
    二维码已经成为了现代生活中不可或缺的一部分。从商业应用到个人生活,我们都可以看到二维码的身影。在Python中实现二维码的索引和检索是一个有趣且有用的挑战。在本篇文章中,我们将介绍如何使用Python实现二维码的索引和检索,并提供一些演示代...
    99+
    2023-09-09
    二维码 开发技术 索引
  • MySQL数据库引擎和索引
    一、MySQL 数据库引擎:1. Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的...
    99+
    2024-04-02
  • 如何使用 PHP 在 MySQL 表中创建索引?
    要使用 mysql 创建索引,可以使用 create index 语句。语法:create index index_name on table_name (column_name);建立...
    99+
    2024-05-12
    mysql 创建索引
  • 如何使用SQL语句在MySQL中进行数据索引和优化?
    如何使用SQL语句在MySQL中进行数据索引和优化?在使用MySQL数据库时,数据索引和优化是非常重要的。适当地创建索引和优化查询语句可以大大提高数据库的性能。本文将详细介绍如何使用SQL语句在MySQL中进行数据索引和优化,并提供具体的代...
    99+
    2023-12-17
    数据索引使用 SQL索引优化 MySQL数据优化
  • SQL Server数据库镜像下有效的索引维护
    SQL Server数据库镜像下有效的索引维护 我们在做索引重建的时候,由于索引重建产生太多日志,习惯切换到大容量日志恢复模式。而在生产环境,我们配置了数据库镜像作为高可用,镜像只能运行于完整恢复...
    99+
    2024-04-02
  • 如何在PHP开发中优化数据库表结构和索引设计?
    如何在PHP开发中优化数据库表结构和索引设计?在PHP开发过程中,数据库是一个必不可少的组成部分。而数据库表结构和索引设计的优化能够使得数据库的查询性能大幅度提升,从而提高系统的整体性能。本文将介绍一些常用的优化方法,以帮助PHP开发者优化...
    99+
    2023-11-02
    PHP优化 索引设计 数据库表结构
  • 如何在PostgreSQL数据库中创建和使用索引
    在PostgreSQL数据库中,可以通过以下步骤来创建和使用索引: 创建索引: 使用CREATE INDEX语句可以在表上创建索引...
    99+
    2024-04-02
  • 如何在MySQL中创建索引
    本篇文章为大家展示了如何在MySQL中创建索引,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是索引?MySQL官方对索引的定义为:索引(Index)是帮助MyS...
    99+
    2024-04-02
  • 如何在mysql中隐藏索引
    这篇文章给大家介绍如何在mysql中隐藏索引,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、说明隐藏索引的特性对性能调整非常有用。在8.0中,索引可以被隐藏和显示。当索引被隐藏时,它不会被查询优化器使用。可以隐藏一个...
    99+
    2023-06-15
  • PHP与MySQL索引的数据更新和索引维护的性能优化策略及其对性能的影响
    摘要:在PHP与MySQL的开发中,索引是优化数据库查询性能的重要工具。本文将介绍索引的基本原理和使用方法,并探讨索引对数据更新和维护的性能影响。同时,本文还提供了一些性能优化策略和具体的代码示例,帮助开发者更好地理解和应用索引。索引的基本...
    99+
    2023-10-21
    PHP 性能优化 MySQL索引 关键词:
  • MySQL数据库给表添加索引
    说明:当数据库中的记录数过多时,查询速度会显著变慢。此时可以给表创建索引,提高查询速度。 一、创建索引前 我现在有一张表,有1000万条记录,根据username值,查询一条记录,测试下查询时间; s...
    99+
    2023-09-18
    数据库 mysql 数学建模
  • 如何在MySQL中创建数据库和表
    在MySQL中创建数据库和表可以通过以下步骤: 1、创建数据库: CREATE DATABASE database_name; 2...
    99+
    2024-04-09
    MySQL
  • 如何有效管理和维护MySQL数据库中的ibd文件
    在MySQL数据库中,每个InnoDB表都对应着一个.ibd文件,这个文件存储了表的数据和索引。因此,对于MySQL数据库的管理和维护,ibd文件的管理也显得尤为重要。本文将介绍如何有...
    99+
    2024-04-02
  • mysql如何清除索引数据库
    今天就跟大家聊聊有关 mysql如何清除索引数据库,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。mysql如何清除索引数据库1.在DOS窗口运行 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作