- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个由 MYISAM 表组成的数据库模式,我有兴趣不时从某些表中删除旧记录。
我知道 delete 不会回收内存空间,但是正如我在 DELETE 命令的描述中发现的,插入可能会重用删除的空间
在 MyISAM 表中,已删除的行在链表中维护,后续的 INSERT 操作会重用旧行位置。
如果 LOAD DATA 命令也重用已删除的空间,我很感兴趣?
更新
我也很感兴趣索引空间是如何回收的?
更新 2012-12-03 23:11
根据@RolandoMySQLDBA 的回答提供了更多信息
执行以下建议的查询后,对于需要重用或回收空间的不同表,我得到了不同的结果:
SELECT row_format FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable1';
> 动态
SELECT row_format FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable2';
> 固定
更新 2012-12-09 08:06
LOAD DATA
当且仅当行格式是固定的或(行格式是动态的并且有删除的行大小完全相同)。
看来如果row_format是动态的,对每条记录都会在删除列表中进行全量查找,如果没有找到准确的行大小,则不使用删除的记录,表内存占用会增加, 此外 LOAD DATA
将花费更多时间来导入记录。
我将排除此处给出的答案,因为它完美地描述了所有过程。
最佳答案
对于名为 mydb.mytable
的 MySQL 表,只需运行以下命令:
OPTIMIZE TABLE mydb.mytable;
您也可以分阶段进行:
CREATE TABLE mydb.mytable_new LIKE mydb.mytable;
ALTER TABLE mydb.mytable_new DISABLE KEYS;
INSERT INTO mydb.mytable_new SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable_new ENABLE KEYS;
ALTER TABLE mydb.mytable RENAME mydb.mytable_old;
ALTER TABLE mydb.mytable_new RENAME mydb.mytable;
ALTER TABLE mydb.mytable_old;
ANALYZE TABLE mydb.mytable;
无论哪种情况,表最终都没有碎片。
试一试!!!
如果您担心通过 LOAD DATA INFILE
批量插入时行是否被重用,请注意以下几点:
当您创建 MyISAM 表时,我假设默认的行格式是动态的。你可以检查它是什么
SHOW CREATE TABLE mydb.mytable\G
或
SELECT row_format FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable';
由于您的表的行格式是动态
,因此碎片行的大小各不相同。 MyISAM 存储引擎会一直检查每个已删除的行长度,以查看下一组插入的数据是否适合。如果传入数据无法容纳任何已删除的行,则会附加新行数据。
The presence of such rows can make myisamchk
struggle .
这就是我建议运行 OPTIMIZE TABLE
的原因。这样,可以更快地附加数据。
您还可以做一些有趣的事情:Try setting concurrent_insert to 2 .这样,您总是在不检查表中的间隙的情况下追加到 MyISAM 表。这将显着加快 INSERT 的速度,但不会影响所有已知的差距。
您仍然可以尽早使用 OPTIMIZE TABLE
对您的表进行碎片整理。
为什么不运行我的第二个建议
CREATE TABLE mydb.mytable_new LIKE mydb.mytable;
ALTER TABLE mydb.mytable_new DISABLE KEYS;
INSERT INTO mydb.mytable_new SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable_new ENABLE KEYS;
ALTER TABLE mydb.mytable RENAME mydb.mytable_old;
ALTER TABLE mydb.mytable_new RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;
这会给你一个想法
OPTIMIZE TABLE
运行需要多长时间.MYD
和 .MYI
在运行 OPTIMIZE TABLE
后会小多少运行我的第二个建议后,您可以将它们与
SELECT
A.mydsize,B.mydsize,A.mydsize - B.mydsize myd_diff,
A.midsize,B.myisize,A.myisize - B.myisize myi_diff
FROM
(
SELECT data_length mydsize,index_length myisize
FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable'
) A,
(
SELECT data_length mydsize,index_length myisize
FROM information_schema.tables
WHERE table_schema='mydb' AND table_name='mytable_new'
) B;
任何 ROW_FORMAT 设置为固定的表都可以每次分配相同长度的行。如果 MyISAM 表维护一个已删除行的列表,则列表中的第一行应始终被选为下一行以插入数据。在找到具有足够长度的合适行间隙之前,无需遍历整个列表。每个删除的行都会在 DELETE
之后快速追加。每个 INSERT 都会选择已删除行的第一行。
我们可以假设这些事情,因为 MyISAM tables can do concurrent inserts .为了通过 concurrent_insert 提供此功能选项,插入 MyISAM 表必须能够检测到三 (3) 个事物之一:
为了使检测 #1 尽可能快,MyISAM 表的 row_format 必须固定。如果是Dynamic,很有可能需要遍历列表。
关于mysql - LOAD DATA 删除后回收磁盘空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13685949/
我正在 div 中加载一个 php 页面,该页面采用发布的变量来显示正确的内容。它的工作原理是这样的: $(".mainArea").load("page.php", {'folder': 'a'})
我是 AWS 新手。我开始学习 ALB 和 NLB。我知道 ALB 在第 7 层协议(protocol)中工作,而 NLB 在第 4 层协议(protocol)中工作。 谁能解释一下ALB和NLB的实
这是来自 this Article . filter(loaded => !loaded) 有什么作用?我没有在任何地方看到该变量的定义。 我明白这个方法的目的是什么,只是不是那一行。 canActi
我应该在 Constructor 还是 FormLoad() 中加载子表单? 我有一些代码调用在控件中嵌入表单的自定义类。我最初是在 Constructor 之外声明我的子窗体,然后在 FormLoa
目录 1、图解 2、json.loads()用法 3、json.load()用法 4、此外还有一种json.dumps 语法
我正在使用 PhoneGap 为 iPad 编写应用程序,我想在不触发 Safari 或使用 ChildBrowser 等内部 Web 浏览器的情况下加载外部 URL。 我正在使用 PhoneGap
人们经常在他们的(与优化和性能相关的)问题和答案中谈论“重载”。 我试图在典型服务器上的常规 Web 应用程序的上下文中量化这一点(以 SO 及其相当小的基础设施为例),假设它们立即返回(以简化和提高
有人可以写这段代码吗: this.Loaded += (s, e) => this.loaded = true; 分成几行代码以便我可以追溯其含义? 在我的代码示例中没有 s 或 e 吗? 最佳答案
我正在使用 jQuery 的 .load()方法和Loading Page Fragments 。以下是我当前的代码: $("#submit").click(function() { $("#
我想实现的是,当单击图像时,在该图像所在的 div 中,加载了一个包含来自另一个 .html 的其他内容的 div,但我无法完成。 如果我这样做,下面的代码将完美运行: $('#windows_lin
我使用 qt 开发了一个 c++ 库。在本文中,我使用 QSqlDatabase 从 SQLite 数据库中查询信息。注意:我的库在 qt 桌面应用程序中运行良好(我在 Linux 上开发)。 现在我
演示:http://jsfiddle.net/FyrRm/1/ 当我们向下滚动时,您会注意到...在滚动到文章标题到 之后我正在展示一个共享小部件。我正在使用 $(window).on("load"
我在 html(PC) 中使用的图像正确加载,我使用了 img 标签。我已将此文件连同图像一起保存并发送到我的手机,但它不会加载到手机上。我对图像大小或任何东西没有任何问题。我认为它与图像位置有关。
我将 .load() 广泛用于 AJAX 内容。很棒,但如果它做得更多一点,我会喜欢它: 如果为了响应用户操作,我多次调用同一个 div 上的 .load(),我可能会在 div 中得到错误的数据。当
我知道很多方法需要调用它的父类(super class)方法,有些方法不需要, 我正在寻找关于方法调配的东西。它在加载方法中初始化,并且在教程中没有[super load]。 我想知道是不是错了,还是
几个月来,我一直在使用pyGame 2.0.1。今天,我升级到最新版本(2.1.2)后,在尝试加载音频文件时开始出现以下错误:。到目前为止我尝试过的东西:。我使用的是Windows 10、Python
我有一个完整的 angular 应用程序,它使用预先加载。 我想将其转换为延迟加载,但是因为我对所有路线都有保护,而且所有路线都是到一条 protected 主路线的子路线,我不知道是否可以做到这一点
我有一个 React 应用程序,它在 useEffect 中调用我的 API,返回一个用作 imy 图像 src 的 URL 列表。 我正在使用 react-loader-spinner 在加载图像时
我正在使用 Slick.js 逐步加载我的图像我注意到有些图像要么部分加载,要么根本没有加载。 例如,在this site上,有两个画廊:建筑和设计(在导航中)。当用户单击任一图像时,他们会看到该图库
我在我的一个项目中收到此警告。这在调用我的后端 api 时会导致问题,因为它调用了 api 两次。我已经尝试过之前在论坛上发布的关于相同查询的解决方案,但我无法解决这个问题。如果有人能帮助我解决这个问
我是一名优秀的程序员,十分优秀!