videojs动态切换路径

watchEffect

  返回  

什么时候需要重建索引

2021/8/20 16:29:35 浏览:

什么时候需要重建索引

​ 索引在普遍意义上能够给数据库带来带来提升,但索引的额外开销也是不容小视的,而索引的重建也是维护索引的重要工作之一。 经过维护的索引可带来以下好处:
1、CBO对于索引的使用可能会产生一个较小的成本值,从而在执行计划中选择使用索引。
2、使用索引扫描的查询扫描的物理索引块会减少,从而提高效率。
3、于需要缓存的索引块减少了,从而让出了内存以供其他组件使用。
重建索引的原因主要包括:
1、 删除的空间没有重用,导致 索引出现碎片
2、 删除大量的表数据后,空间没有重用,导致 索引"虚高"
3、索引的 clustering_facto 和表不一致
也有人认为当索引树高度超过4的时候需要进行重建,但是如果表数量级较大,自然就不会有较高的树,而且重建不会改变索引树高度,除非是由于大量引起的索引树“虚高”,重建才会改善性能,当然这又回到了索引碎片的问题上了。

索引出现碎片

​ 由于索引中只有删除和插入操作,且索引中更新完全不同于表达更新。如果索引中的 记录关键字需要更新,就需要将旧记录的位置标记为删除,并在相应的叶子节点插入新的索引纪录。这种删除标记并非真正的删除索引块中的记录,索引块中被标记 为删除的记录只有在相同索引条目插入到相同块的相同位置时才能重用。由于即使相同的索引记录也不一定插入到被删除的空间中,故如果对索引频繁进行 update和delete操作很容易导致索引出现碎片。较高的PCTFREE也容易出现索引碎片。索引的碎片也就导致了,访问索引数据时需要访问更多的 索引块

官方介绍

​ When a secondary index column is updated, old secondary index records are delete-marked, new records are inserted, and delete-marked records are eventually purged. When a secondary index record is delete-marked or the secondary index page is updated by a newer transaction, InnoDB looks up the database record in the clustered index. In the clustered index, the record’s DB_TRX_ID is checked, and the correct version of the record is retrieved from the undo log if the record was modified after the reading transaction was initiated.

索引虚高

上面的说的是频繁update和delete导致索引块中有碎片,那如果进行大量的delete操作把整个索引块的数据都删了呢?索引中的索引条目仍然只 被标记为删除而没有被真正清空。设想下,如果这时候的索引关键字是一个不断增大的id,那么被标记为删除的索引条目就永远不会被重用,那树就不会不断增 长,也就出现了,表的数据空间减少了,而索引的数据空间却在不断增大的情况。由于索引的高度不断增加,访问索引数据时需要访问更多的索引块。

MySQL中如何找出碎片化严重的表

关于MySQL中表碎片化,那么如何找出MySQL中的碎片,一般有两种方法。

方法1:使用show table status from xxxx like ‘xxxx’ \G;

​ 第一个xxx:表所在的数据库名称,第二个xxx:要查询的表名。这个方法其实不太实用。例如,只能单个表的查询碎片化情况(难道一个数据库要一个个表去试?),不能查询某个数据库或整个实例下所有表的碎片化等等。这里仅仅作为一个参考方法而已。

方法2:查询information_schema.TABLES获取表的碎片化信息。

SELECT TABLE_SCHEMA
      ,TABLE_NAME 
      ,ENGINE
      ,ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) AS SIZE_MB
      ,ROUND(DATA_FREE/1024/1024,2) AS FREE_SIZ_MB
FROM information_schema.TABLES 
WHERE DATA_FREE >=10*1024*1024
ORDER BY FREE_SIZ_MB DESC;

MySQL中如何减低表的碎片

​ 在MySQL中,可以使用OPTIMIZE TABLE、ALTER TABLE XXXX ENGINE = INNODB这两种方法降低碎片,关于这两者的简单介绍如下:

  • Dump and Reload Method
  • ALTER TABLE Method 对表进行碎片整理
  • REPAIR TABLE Method

学习地址:

https://dev.mysql.com/doc/refman/5.7/en/rebuilding-tables.html

https://www.cnblogs.com/Alight/p/4601003.html

https://www.cnblogs.com/kerrycode/p/10943122.html

https://lefred.be/content/overview-of-fragmented-mysql-innodb-tables/

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号