`
风雪涟漪
  • 浏览: 508607 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9069
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18481
社区版块
存档分类
最新评论

Schema的优化和索引 - 索引和表的维护

阅读更多

当你已经创建了一张表,有合适的数据类型,并添加了索引之后,其实你的工作还并没有结束:你还需要维护你的表和索引使它们工作的更好。表的维护有三个主要的目标:发现和解决表的损坏,维护准确的索引统计,并且要降低存储碎片。

 

找到和修复损坏的表

最差的事情莫过于表已经损坏了。对于MyISAM,大部分是由于当机所造成的。然而,所有的存储引擎都会由于硬件问题或者MySQL内部BUG再或者操作系统的原因导致索引的损坏。

 

损坏的索引能导致查询返回不正确的结果,当没有重复值出现却抛出重复键值的错误,或者导致查询死锁和当机。如果你碰到了奇怪的行为-比如一个你意想不到的错误,就CHECK TABLE来查看表是否损坏。CHECK TABLE一般可以检查大部分表和索引的损坏。

 

你可以使用REPAIR TABLE来修复。但是并不是所有的引擎都支持这个命令。这样你可以使用ALTER命令,比如修改和表相同的存储引擎。

 

mysql> ALTER TABLE innodb_tbl ENGINE=INNODB;

 

你也可以使用离线的针对存储引擎的修复工具。比如myisamchk或者删除数据再重新加载。然而,如果换坏是发生在系统中,或者在表中的“行数据”取代了索引,你就无能为力了。这种情况下,你只能从备份中恢复表或者从损坏的文件中恢复数据。以后会详细说到。

 

更新索引的统计

MySQL的查询优化器使用两个API从存储引擎中得知当决定怎样使用索引的时候,索引是怎样分布的。第一个是records_in_range调用。它传入终结点范围并且返回了范围的记录的值。第二个就是info(),它返回了不同类型的数据,包括了索引的基数(对于每个键值有多少数据)。

 

当存储引擎并没有提供给优化器关于查询行数的准确信息,这个优化器就会使用索引的统计信息。这个信息你可以使用ANALYZE TABLE来估计下行数。MySQL的优化器是基于成本的,并且最主要的消耗因素就是这个查询要访问多少数据。如果这个统计信息没有生成,或者如果它们过期了,优化器可能就会有个比较差的决定。方案就是使用ANALYZE TABLE来生成统计数据。

 

每个存储引擎生成索引的统计数据各不相同,索引你使用ANALYZE TABLE的频率也不同,同样的消耗成本也不同:

 

  • Memory存储引擎不会存储索引统计信息。
  • MyISAM在硬盘上存储统计信息,并且ANALYZE TABLE执行了全索引扫描来计算。这个过程这张表是锁定的。
  • InnoDB并不是在硬盘上存储统计信息。但是使用随机索引进入首次打开的表的方法来估算它们。对于InnoDB,ANALYZE TABLE使用的是随机的方式。因此统计结果不精确的,它们不需要手动更新,除非你服务器运行了很长时间。ANALYZE TABLE也不回加锁消耗也相对低些。因此你可以在线的更新统计信息而不会影响正常工作。
你可以使用SHOW INDEX FROM来查看索引信息。
mysql> SHOW INDEX FROM sakila.actor\G
*************************** 1. row ***************************
Table: actor
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: actor_id
Collation: A
Cardinality: 200
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
*************************** 2. row ***************************
Table: actor
Non_unique: 1
Key_name: idx_actor_last_name
Seq_in_index: 1
Column_name: last_name
Collation: A
Cardinality: 200
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE

给出了很多索引信息。MySQL文档有详细说明。我们要注意的是Cardinality。这显示了在索引中存储引擎估算了多少个唯一的值。MySQL5.0中你也可以在INFORMATION_SCHEMA.STATISTICS表中获得这些信息,这样更方便了。举个例子,如果你可以写一条查询INFORMATION_SCHEMA的语句,来发现选择性更低的索引。


减少索引和数据碎片

B-TREE索引比较容易有碎片。这样会降低性能的。碎片的索引会糟糕的并且/或者不连续的存放在硬盘上。B-TREE索引需要随机硬盘访问来“跳”到叶子页上,因此随机访问是个规则,并不是例外。然而,如果他们物理存储是连续的并且轻微压缩的,那么叶子页的表现仍会很好。如果并不是这样,我们就说它们是碎片的,并且范围扫描和全索引扫描速度会成倍的降低。尤其是对于全索引覆盖的语句。

表的数据存储也会变为碎片。然而,数据存储碎片要比索引碎片复杂的多。有两种数据碎片:

  • 行碎片.当行存储在多个位置的多个片段伤的时候,就产生了这个类型的碎片。即使查询需要索引中的一个单独的行,行碎片也能导致性能的降低。
  • 内部行碎片。当逻辑的连续页或者行并不是连续的存储在硬盘上就导致了内部行的碎片。它能影响全表扫描和聚簇索引范围扫描,这些操作一般都可以从连续存储在硬盘上的数据得到一些好处。
MyISAM表都会遇到这两种碎片,而INNODB不会有短行的碎片。

为了去掉碎片数据,你可以使用OPTIMIZE TABLE或者丢掉和重新导入数据。

这两个方法对于大部分引擎来说是比较好用的。对于如MyISAM的引擎,通过排序算法重新创建索引来消除碎片。到目前为止,还没有方法消除InnoDB的碎片。在M又SQL5.0中InnoDB还不同通过排序来创建索引。甚至你重新删除和创建索引,它们还是碎片的。

对于一些不支持OPTIMIZE TABLE的存储引擎。你可以使用ALTER TABLE来重新创建表。仅仅要更改表的存储引擎,当然这个存储引擎就是当前表的。

mysql> ALTER TABLE <table> ENGINE=<engine>;

 

分享到:
评论

相关推荐

    PyPI 官网下载 | tableschema-elasticsearch-0.3.0.tar.gz

    - 将结构化的Table Schema数据高效地映射到Elasticsearch索引中。 - 定义数据模型,确保数据导入时遵循预设的结构。 - 实现数据的自动验证,防止不合规数据的输入。 - 提供简便的API,用于数据的插入、更新、查询和...

    oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文

    以上是Oracle数据库中创建表、索引、表空间、触发器、用户和序列的基本操作。在实际应用中,根据业务需求可能还需要考虑其他因素,如分区、约束、存储过程、视图等。掌握这些基本操作对于理解和管理Oracle数据库至关...

    查看mySQL数据库索引

    `INFORMATION_SCHEMA.STATISTICS`表中包含了关于MySQL中所有表的索引统计信息,包括索引名称、索引类型、索引列等。 #### 三、解读`INFORMATION_SCHEMA.STATISTICS`表 `INFORMATION_SCHEMA.STATISTICS`表包含了多...

    哈工大数据库考试模拟题 - 2018

    存储在介质上的数据的结构描述,含存储路径、存储方式、索引方式等 模式指全局模式 视图指外部视图 两层映像 E-C Mapping:External Schema-Conceptual Schema Mapping ----将外模式映射为概念模式,从而支持实现...

    mysql-schema-sync-同步mysql表结构

    MySQL Schema Sync是一个用于同步MySQL数据库表结构的工具,它能够帮助开发者在多个数据库实例之间保持...在实际使用过程中,可能还需要结合其他数据库管理工具和版本控制工具,以形成一个完整的数据库开发和维护流程。

    mysql面试题-mysql经典面试题目-数据库的基本概念-SQL语法-事务处理-索引优化-性能调优-mysql-面试题目

    数据库优化包括查询优化、索引优化、存储优化等,常见的方法有调整SQL语句、创建合适索引、合理设计表结构和使用存储过程等。 表关联包括一对一、一对多和多对多关联,例如,员工和部门可以是一对多关联,部门和...

    Schema_Workbench

    - **元数据管理**:该工具提供了一种可视化的方式来管理和维护数据仓库的元数据,包括表、字段、键、索引等,有助于保持数据的整洁和一致性。 - **ETL工作流集成**:Schema_Workbench可以与Pentaho Data ...

    Python库 | scrape_schema_recipe-0.1.3-py2.py3-none-any.whl

    `scrape_schema_recipe-0.1.3-py2.py3-none-any.whl` 是一个针对Python开发者的库,主要用于后端数据抓取和结构化数据处理。这个库的名称暗示了它的主要功能可能与网络爬虫(scraping)和Schema.org标准有关,可能...

    MySQL优化面面观----优化查询效率.pdf

    索引设计需兼顾查询覆盖率和维护成本,字段类型选择应以简洁和匹配实际需求为主,尽量减少不必要的存储空间占用。通过这些方法,可以在不牺牲数据完整性和系统稳定性的情况下,有效地提升数据库的查询效率。

    MySQL数据库:使用NAVICAT工具创建和管理索引.pptx

    MySQL数据库是世界上最流行的开源关系...因此,应根据实际需求和数据查询模式来合理创建和维护索引,以实现数据库的最佳性能。在使用NAVICAT进行这些操作时,应确保熟悉其界面和功能,以便更高效地进行数据库管理工作。

    Star-Shema 完全参考手册

    5. **性能优化**:讨论如何通过索引、分区、物化视图等技术提升星型模式的查询效率。 6. **ETL过程**:介绍如何从源系统抽取、转换和加载数据到星型模式的数据仓库,包括数据清洗、错误处理和变更数据捕获。 7. **...

    VIP-mysql索引优化实战一.pdf

    在这个表中定义了一个复合索引`idx_name_age_position`,该索引包含`name`、`age`和`position`三个字段,并使用B+树结构存储。 #### 二、插入数据 接着,我们向`employees`表中插入了几条示例数据: ```sql ...

    西北工业大学软件学院数据库设计试验作业(全)

    - 查询优化:理解查询计划,避免全表扫描,利用索引进行高效查询。 - 分区和分片:大型数据库可能需要分区或分片技术,以分散存储和处理负载。 5. **数据库安全性**: - 权限管理:通过GRANT和REVOKE命令分配和...

    Mysql优化选择最佳索引的方法共2页.pdf.zip

    10. **监控和调整**:定期检查数据库性能,使用性能分析工具,如MySQL的Performance Schema,发现潜在的索引问题,并根据实际情况调整索引策略。 综上所述,优化MySQL索引的关键在于理解业务需求,结合查询模式和...

    DB2索引分析器使用简述

    正确地创建和维护索引可以显著提高数据检索的速度。DB2提供了多种工具来帮助用户管理和优化索引,其中“db2advis”索引分析器是一个非常有用的工具,它能够为用户提供有关如何改进查询性能的建议。 #### 一、DB2...

    mysql-schema-sync:mysql表结构自动同步工具(目前只支持分割,索引的同步,分区等高级功能暂不支持)

    同步新表同步轴向变动:添加,修改同步索引变动:添加,修改支持预览(只对比不同步变动)邮件通知变动结果支持屏蔽更新表,基线,索引,外键支持本地比线上额外的多一些表,分段,索引,外键安装去-u github....

    PyPI 官网下载 | schema_salad-8.2.20211116214159-py3-none-any.whl

    这个资源是从 Python 的官方软件包索引(Python Package Index,简称 PyPI)下载的,确保了其来源的可靠性和安全性。PyPI 是所有开源 Python 项目发布和分享代码的地方,用户可以通过 `pip` 工具方便地安装这些库。 ...

    kvs-schema-源码.rar

    深入学习KVS-Schema的源码,我们可以了解到如何设计和实现一个支持Schema的键值存储系统,包括数据结构的设计、编译过程、验证逻辑、查询优化和实际的存储操作。这对于理解和优化分布式数据库系统、提升数据存储性能...

    MySQL5.7-optmization

    - 了解不同存储引擎如何管理和维护索引统计信息,以便更好地优化查询。 - InnoDB和MyISAM在索引管理方面有所不同,需要针对每种情况采取不同的策略。 8. **B-树与哈希索引比较** - 比较两种索引类型的优缺点,...

Global site tag (gtag.js) - Google Analytics