高性能的MySQL(5)索引策略-索引和表的维护

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

维护表有三个主要的目的:

1、找到并修复损坏的表

对于MyISAM存储引擎来说,表损坏通常是系统崩溃导致的。其他的引擎也会由于硬件的问题,MySQL本身的缺陷或者操作系统的问题导致索引的损坏。

损坏的索引,会导致查询返回错误的结果或者莫须有的主键冲突等问题,严重时还会导致数据库崩溃。

这类情况,可以尝试check table来检查是否发生了表损坏,有些存储引擎不支持这个命令。

可以使用repair table 来修复损坏的表,但同样不是所有引擎都支持该命令。

如果引擎不支持,可以使用alter操作重建表,或者将数据导出然后再重新导入。

InnoDB一般不会损坏,如果发生损坏,一般要么是数据库硬件问题,例如内存或者磁盘问题,要么就是数据库管理员操作导致。

常见的错误是由于尝试使用rsync备份InnoDB导致的。

如果是某条查询导致的,那一定是遇到了bug,而不是查询的问题。


2、维护准确的索引统计信息。

MySQL的查询优化器会通过2个API来了解存储引擎的索引值的分布信息,以决定如何使用索引。

第一个API是records_in_range(),通过向存储引擎传入两个边界值获取在这个范围大概有多少条记录。

对于某些引擎,该接口返回精确值,比方说MyISAM;对于InnoDB则是一个估算的值。

第二个API是info(),该接口返回各种类型的数据,包括索引的基数。

当返回信息不准确的时候,优化器会使用索引统计信息来估算扫描行数。如果表没有统计信息,或者统计信息不准确,优化器很可能做出错误的决定。

可以运行analyze table 来重新生成统计信息。

Memory引擎不存储索引统计信息

MyISAM将索引统计信息存储在磁盘中,analyze table 需要进行一次全表扫描,整个过程需要锁表。

MySQL5.5以后,InnoDB也不在磁盘存储索引统计信息,而是通过随机的索引访问来进行评估并存储在内存中。

使用show index from 命令可以察看索引基数(Cardinality)

170652224.png

InnoDB会在首次打开表,或者执行analyze table,或者表大小发生变化超过1/16或show table status,或show index时候都会计算索引的统计信息,如果服务器有大量的数据,这会是个严重的问题,只要show index查看索引统计信息就一定会触发统计信息更新,可以关闭

innodb_stats_on_metadata参数来关闭。

一旦关闭自动更新,那么需要周期性的使用analyze table 来手动更新,否则问题大了。


3、减少索引和数据碎片

B-Tree索引可能会碎片化,这会降低查询效率。碎片化的索引可能会以很差或者无序的方式存储在磁盘上。

可以通过optimize table 或者导出再导入的方式来重新整理数据。

对于不支持optimize table 的存储引擎,可以通过一个不做任何操作的alter table来重建表。

1
alter  table  < table > engine=<engine>;

也可以先删除索引,重建表,最后重新创建索引来实现。


索引的介绍就先到这里了,明天进入查询性能优化部分!

















本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1314057,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
存储 关系型数据库 MySQL
《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
26 2
|
14天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
12 0
|
14天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
79 1
|
6天前
|
存储 运维 关系型数据库
高性能 MySQL 第四版(GPT 重译)(四)(2)
高性能 MySQL 第四版(GPT 重译)(四)
41 4
|
6天前
|
存储 缓存 关系型数据库
高性能 MySQL 第四版(GPT 重译)(三)(1)
高性能 MySQL 第四版(GPT 重译)(三)
51 4
|
11天前
|
存储 关系型数据库 MySQL
【MySQL实战笔记】 04 | 深入浅出索引(上)-02
【4月更文挑战第9天】InnoDB数据库使用B+树作为索引模型,其中主键索引的叶子节点存储完整行数据,非主键索引则存储主键值。主键查询只需搜索一棵树,而非主键查询需两次搜索,因此推荐使用主键查询以提高效率。在插入新值时,B+树需要维护有序性,可能导致数据页分裂影响性能。自增主键在插入时可避免数据挪动和页分裂,且占用存储空间小,通常更为理想。然而,如果场景仅需唯一索引,可直接设为主键以减少查询步骤。
13 1
【MySQL实战笔记】 04 | 深入浅出索引(上)-02
|
13天前
|
关系型数据库 MySQL 数据库
6. 了解过Mysql的索引嘛 ?
了解MySQL的索引类型,包括单列索引(普通、唯一、主键和全文索引)和组合索引。单列索引用于一列,如普通索引允许重复值,唯一索引和主键索引不允许,后者不允许空值。全文索引适用于特定文本字段。组合索引是多列的,遵循左前缀原则,通常推荐用于提高查询效率,除非是主键。
12 0
|
15天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)
|
1月前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
84 1
|
4天前
|
关系型数据库 MySQL 数据库
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)
27 4