关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » MySQL »浅析MySQL数据碎片的产生

    浅析MySQL数据碎片的产生

    2011-03-30 09:28:00 出处:ITJS
    分享

    该篇文章浅析MySQL数据碎片的产生:定义,时间及成因。

    MySQL列表,包括MyISAM和InnoDB这两种最常见的类型,而根据经验来说,其碎片的产生及消除都是随机的。碎片会在你的表格中留下明显的空白,而这会给列表扫描工作带来相当大的困扰。对你的列表进行优化,这样会使列表的全面及分区扫描工作进行得更有效率。

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

    这种额外的破碎的存储空间在读取效率方面比正常占用的空间要低得多。让我们看一个实例。

    我们将创建一个数据库(有时也称其为大纲)及一个测试用的列表:

    (chinastor.com-root@localhost) [test]> create database frag_test;  Query OK, 1 row affected (0.03 sec)   (chinastor.com-root@localhost) [test]> use frag_test;  Database changed   (chinastor.com-root@localhost) [frag_test]> create table frag_test (c1 varchar(64));  Query OK, 0 rows affected (0.05 sec) 

    现在让我们在列表中加入如下几行:

    (chinastor.com-root@localhost) [frag_test]> insert into frag_test values ('this is row 1');  Query OK, 1 row affected (0.01 sec)   (chinastor.com-root@localhost) [frag_test]> insert into frag_test values ('this is row 2');  Query OK, 1 row affected (0.00 sec)   (chinastor.com-root@localhost) [frag_test]> insert into frag_test values ('this is row 3');  Query OK, 1 row affected (0.00 sec) 

    现在我们进行碎片查看:

    (chinastor.com-root@localhost) [frag_test]> show table status from frag_testG;  *************************** 1. row ***************************             Name: frag_test           Engine: MyISAM          Version: 10       Row_format: Dynamic            Rows: 3   Avg_row_length: 20      Data_length: 60  Max_data_length: 281474976710655     Index_length: 1024        Data_free: 0   Auto_increment: NULL     Create_time: 2011-02-23 14:55:27      Update_time: 2011-02-23 15:06:55       Check_time: NULL       Collation: latin1_swedish_ci         Checksum: NULL  Create_options:           Comment:   1 row in set (0.00 sec) 

    现在我们删除一行,并再次检测:

    (chinastor.com-root@localhost) [frag_test]> delete from frag_test where c1 = 'this is row 2';  Query OK, 1 row affected (0.00 sec)   (chinastor.com-root@localhost) [frag_test]> show table status from frag_testG;  *************************** 1. row ***************************             Name: frag_test           Engine: MyISAM          Version: 10       Row_format: Dynamic            Rows: 2   Avg_row_length: 20      Data_length: 60  Max_data_length: 281474976710655     Index_length: 1024        Data_free: 20   Auto_increment: NULL     Create_time: 2011-02-23 14:55:27      Update_time: 2011-02-23 15:07:49       Check_time: NULL       Collation: latin1_swedish_ci         Checksum: NULL  Create_options:           Comment:   1 row in set (0.00 sec) 

    需要注意的是,“data_free”一栏显示出了我们删除第二行后所产生的留空空间。想象一下如果你有两万行指令的话,结果是什么样的。以此推算,它们将耗费四十万字节的存储空间。现在如果你将两万条命令行删到只剩一行,列表中有用的内容将只占二十字节,但MySQL在读取中会仍然将其视同于一个容量为四十万字节的列表进行处理,并且除二十字节以外,其它空间都被白白浪费了。

    幸运的是一旦你锁定了这一问题,MySQL提供了一种简便的修正方法。这就是所谓的优化列表,具体内容如下:

    (chinastor.com-root@localhost) [frag_test]> optimize table frag_test;  +---------------------+----------+----------+----------+  | Table               | Op       | Msg_type | Msg_text |  +---------------------+----------+----------+----------+  | frag_test.frag_test | optimize | status   | OK       |   +---------------------+----------+----------+----------+  1 row in set (0.00 sec)   (chinastor.com-root@localhost) [frag_test]> show table status from frag_testG;  *************************** 1. row ***************************             Name: frag_test           Engine: MyISAM          Version: 10       Row_format: Dynamic            Rows: 2   Avg_row_length: 20      Data_length: 40  Max_data_length: 281474976710655     Index_length: 1024        Data_free: 0   Auto_increment: NULL     Create_time: 2011-02-23 14:55:27      Update_time: 2011-02-23 15:11:05       Check_time: 2011-02-23 15:11:05        Collation: latin1_swedish_ci         Checksum: NULL  Create_options:           Comment:   1 row in set (0.00 sec) 

    “优化列表”功能在进行中会对整个列表进行锁定。对于小型列表,这一功能的效果非常好,因为整个列表的读取和修改速度都会很快。但对于那些体积巨大的列表来说,这一过程将消耗很长时间,并且其间会中断或减少可用的应用程序数量。怎么办?

    再一次,MySQL幸运地提供了一项堪称伟大的功能,名为“主-主复制”。在这种配置之下,你的后台数据库实际上成为两个单独的数据库,一个主动可调用的,一个被动可调整的。这两个数据库在各方面来说都是完全相同的。要实现各种在线操作——包括“优化列表”操作——只需在你的被动数据库中即可进行。这将不会对你的应用程序造成丝毫影响。一旦优化操作完成,主、被动数据库将互相转换,以便应用程序直接指向二号数据库,对还未进行优化的主动数据库部分自动开始优化工作。

    这时,两套数据库的角色已经互换,而应用程序也将顺利指向二号数据库,执行与在一号数据库上相同的列表优化。而现在主动已经转换为被动,因此不会中断主要任务处理。

    显示你数据库中存在碎片的全部列表:

    (chinastor.com-root@localhost) [(none)]> select table_schema, table_name, data_free, engine from information_schema.tables where table_schema not in ('information_schema', 'mysql') and data_free > 0;  +--------------+-----------------------------+-----------+--------+  | table_schema | table_name                  | data_free | engine |  +--------------+-----------------------------+-----------+--------+  | aitc         | wp_comments                 |    346536 | MyISAM |   | aitc         | wp_options                  |     64308 | MyISAM |   | aitc         | wp_postmeta                 |       124 | MyISAM |   | cactidb      | poller_item                 |       160 | MyISAM |   | cactidb      | poller_output               |       384 | MyISAM |   | drupal       | sessions                    |     30976 | MyISAM |   | drupal       | users                       |        92 | MyISAM |   | drupal       | variable                    |        20 | MyISAM |   | gg           | wp_comments                 |       232 | MyISAM |   | gg           | wp_options                  |       696 | MyISAM |   | gg           | wp_postmeta                 |       560 | MyISAM |   | ihi          | wp_comments                 |       536 | MyISAM |   | ihi          | wp_options                  |       444 | MyISAM |   | ihi          | wp_postmeta                 |       288 | MyISAM |   | ihi          | wp_redirection_items        |      1292 | MyISAM |   | ihi          | wp_redirection_logs         |    140352 | MyISAM |   | nds          | wp_comments                 |      4704 | MyISAM |   | nds          | wp_options                  |    150580 | MyISAM |   | nds          | wp_postmeta                 |        76 | MyISAM |   | oos          | wp_comments                 |    317124 | MyISAM |   | oos          | wp_options                  |     88196 | MyISAM |   | oos          | wp_postmeta                 |        76 | MyISAM |   | phplist      | phplist_listuser            |       252 | MyISAM |   | phplist      | phplist_sendprocess         |        52 | MyISAM |   | phplist      | phplist_user_user           |     32248 | MyISAM |   | phplist      | phplist_user_user_attribute |       120 | MyISAM |   | phplist      | phplist_user_user_history   |       288 | MyISAM |   | phplist      | phplist_usermessage         |      1428 | MyISAM |   | pn_nds       | nuke_session_info           |     12916 | MyISAM |   | psa          | exp_event                   |     10024 | MyISAM |   | test         | active_sessions             |     30144 | MyISAM |   +--------------+-----------------------------+-----------+--------+  31 rows in set (0.26 sec) 

    如果你更改了某个列表的存储引擎,你也应该对这一列表进行碎片清理。这是因为MySQL的工作原理导致其必须读取整个列表,然后利用新的存储引擎将内容写回磁盘,而在此过程中碎片所在的位置及影响到的数据都对执行效率造成了严重的不良影响。

    上述情况如下所示:

    (chinastor.com-root@localhost) [frag_test]> alter table frag_test engine = innodb;  Query OK, 2 rows affected (0.17 sec)  Records: 2  Duplicates: 0  Warnings: 0   (chinastor.com-root@localhost) [frag_test]> show table status from frag_test      -> G;  *************************** 1. row ***************************             Name: frag_test           Engine: InnoDB          Version: 10       Row_format: Compact             Rows: 2   Avg_row_length: 8192      Data_length: 16384  Max_data_length: 0     Index_length: 0        Data_free: 0   Auto_increment: NULL     Create_time: 2011-02-23 15:41:12      Update_time: NULL      Check_time: NULL       Collation: latin1_swedish_ci         Checksum: NULL  Create_options:           Comment: InnoDB free: 7168 kB  1 row in set (0.00 sec) 

    如果你发现一些列表中包含了大量的数据留空现象,那么对其进行优化是绝对值得的,因为这一过程会大大提升列表的读取性能及应用表现。

    原文地址:http://www.databasejournal.com/features/mysql/article.php/3927871/article.htm

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。