zoukankan      html  css  js  c++  java
  • Mysql数据碎片的产生与优化

    Mysql数据碎片的产生与优化

    Mysql常用的数据存储引擎一般就两个,一个是InnoDB,一个是MyISAM。而无论那种存储引擎都可能阐述数据碎片。

    碎片的产生

    每当MySQL从你的表中删除了一行数据,该段空间就会被留空。而在一段时间内的大量删除操作,会使这种留空的空间变得比存储表数据所使用的空间更大。当MySQL对数据进行扫描时,它扫描的对象实际是表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分。如果进行新的插入操作,MySQL将尝试利用这些留空的区域,但仍然无法将其彻底占用。

    简单来说就是,数据删除了之后,使得数据不连续了,中间产生了空白,当再查询新数据的时候,Mysql会利用这些空白,但是总是不会完全占满的。甚至有时候一行数据被分在了多个地方。

    这种额外的破碎的存储空间在读取效率方面比正常情况要低得多。

    使用show table status like '表名',可以查看到数据碎片信息,返回数据中,Data_free大于0时即说明存在数据碎片。

    我们可以使用命令:

    select table_schema, table_name, data_free, engine from information_schema.tables where table_schema not in ('information_schema', 'mysql') and data_free > 0;

    查询出所有有数据碎片的表,以及碎片的数量(字节)。

    对于MyISAM类型的存储引擎,可以直接使用optimize table 表名,来优化表。因为这类型的存储引擎索引和数据是分开的,所以使用这个命令可以整理数据文件并重排索引。

    对于InnoDB类型的存储引擎,我们则可以使用alter table 表名 engine = innodb;命令来重建表。

    这些命令的执行会临时锁住表,当数据量越大的时候耗时也越多,所以不宜经常执行此操作。比较好的方式是做个定时Script,比如每周执行一次(这个可以根据具体业务的碎片产生速度来定)。

    这样当访问量比较大的时候,整体命中及效率都会得到很大的提升。

    show STATUS like 'innodb_row_lock%'  查看锁的一些情况

  • 相关阅读:
    移动端按钮居底
    easyui用KindEditor编辑器
    查找数组中与后面项匹配的和猴子选大王
    before和after的样式符号
    jq的select
    验证最多2位小数,1到10 不超过10 带两位小数的正则表达式
    在谷歌浏览器下vue的@input事件问题
    mvc项目+vue+vant【进行中】
    微商代理查询系统 开发完成,免费体验试用哦!
    淘宝出了个麻吉宝区块连产品,附带麻吉宝邀请码!
  • 原文地址:https://www.cnblogs.com/xiangshihua/p/14784745.html
Copyright © 2011-2022 走看看