创建和删除索引后 MySQL 性能提升

2024-03-11

我有一个大型 MySQL、MyISAM 表,大约有 400 万行,在 core 2 duo、8G RAM 笔记本电脑上运行。

该表有 30 列,包括 varchar、decimal 和 int 类型。

我在 varchar(16) 上有一个索引。我们将此列称为:“indexed_varchar_column”。

我的查询是

SELECT 9 columns FROM the_table WHERE indexed_varchar_column = 'something';

对于我查询的每个“东西”,它总是返回大约 5000 行。

查询的 EXPLAIN 返回以下内容:

+----+-------------+-------------+------+----------------------------------------------------+--------------------------------------------+---------+-------+------+-------------+
| id | select_type | table       | type | possible_keys                                      | key                                        | key_len | ref   | rows | Extra       |
+----+-------------+-------------+------+----------------------------------------------------+--------------------------------------------+---------+-------+------+-------------+
|  1 | SIMPLE      | the_table   | ref  | many indexes including indexed_varchar_column      | another_index NOT: indexed_varchar_column! | 19      | const | 5247 | Using where |
+----+-------------+-------------+------+----------------------------------------------------+--------------------------------------------+---------+-------+------+-------------+

首先,我不确定为什么选择 another_index 。事实上,它选择的索引是 indexed_varchar_column 和另外 2 列(构成所选列的一部分)的复合索引。也许这是有道理的,因为它可能会使事情变得更快一些,因为不必读取查询中的 2 列。真正的问题是下一个:

对于我匹配的每个“某物”,查询需要 5 秒。第二次我查询“某事”时,需要 0.15 秒(我猜是因为查询正在被缓存)。当我对“something_new”运行另一个查询时,又需要 5 秒。所以,它是一致的。

问题是:我发现创建一个索引(另一个复合索引,包括我的 indexed_varchar_column)并再次删除它会导致所有针对新“something_other”的进一步查询只需要 0.15 秒。请注意 1) 我创建了一个索引 2) 再次删除它。所以一切都处于相同的状态。

我猜想构建和删除索引所需的所有操作都会使 SQL 引擎缓存一些内容,然后再重新使用。当我在查询上运行 EXPLAIN 时,我得到的结果与以前完全相同。

如何继续了解创建删除索引过程中缓存的内容,以便我可以在不操作索引的情况下缓存它?

UPDATE:

根据 Marc B 的评论,建议当 mySQL 创建索引时,它会在内部执行 SELECT...我尝试了以下操作:

SELECT * FROM my_table;

花费了 30 秒,返回了 400 万行。好处是所有进一步的查询再次变得非常快(直到我重新启动系统)。请注意,重新启动后查询再次变慢。我猜这是因为 mySQL 正在使用某种操作系统缓存。

任何想法?如何显式缓存我猜测的表?

更新2:也许我应该提到这个表可能严重碎片化。它有 400 万行,但我定期删除许多旧字段。我还添加新的。由于我每天都有很大的 ID 间隙(对于已删除的行),因此我删除主索引 (ID) 并使用连续的数字再次创建它。该表可能非常分散,因此 IO 一定是一个问题...不知道该怎么办。


感谢大家的帮助。

最后我发现(感谢 Marc B 的提示)在多次 INSERT 和 DELETE 后我的表严重碎片化。几个小时前我用此信息更新了问题。有两件事有帮助:

1)

ALTER TABLE my_table ORDER BY indexed_varchar_column;

2)跑步:

myisamchk --sort-records=4 my_table.MYI  (where 4 corresponds to my index)

我相信这两个命令是等效的。即使系统重新启动后查询也很快。 我已将此 A​​LTER TABLE ORDER BY 命令放在每天运行的 cron 上。虽然需要 2 分钟,但这是值得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建和删除索引后 MySQL 性能提升 的相关文章

随机推荐

  • 使用复制的 git 存储库安全吗?

    如果我使用以下命令复制跟踪文件夹rsync a or cp R 然后我可以像使用 git 克隆一样使用该副本吗 或者这会导致各种奇怪的问题吗 这一切都在我的计算机上运行 因此没有其他人访问该存储库 显然 git cloned 目录知道它是从
  • 动态计算 Pandas 中公式的表达式

    我想使用一个或多个数据帧列执行算术pd eval 具体来说 我想移植以下计算公式的代码 x 5 df2 D df1 A df1 B x 使用代码pd eval 使用理由pd eval是我想自动化许多工作流程 因此动态创建它们对我很有用 我的
  • 在 Linux 上以汇编形式输出整数

    这需要在纯汇编中完成 即没有库或对 C 的调用 我理解问题的本质 需要将整数除以 10 将一位数余数转换为 ASCII 输出 然后用商重复该过程 但由于某种原因 它不起作用 我在 x86 上使用 NASM 这是我到目前为止所拥有的 不输出任
  • UICollectionView 的单元格消失

    发生了什么 目前我有一个应用程序使用两个UICollectionViews里面一个UITableView 通过这种方式 我创建了一个看起来像 Pulse News 的应用程序 我的问题是 有时第 6 行和第 11 行完全消失 在本应是单元格
  • 我想通过 graph api 分享朋友的帖子

    我想通过 graph api 在 facebook 上分享一些帖子 但是没有这样的api 只有 饲料 存在 我尝试使用 me feed 图形 API 操作来分享我朋友的帖子 以及页面中的帖子 但它和我在 Facebook 网站上分享的不一样
  • 开发 BlackBerry OS6 需要哪个版本的 Blackberry JRE

    我下载了适用于 BlackBerry 的 Eclipse 插件 默认情况下具有 BlackBerry OS 7 运行时 我需要定位 BlackBerry OS 6 和 OS 7 设备 这也适用于 BlackBerry OS 6 还是我需要更
  • 加快我的批处理文件解析速度

    我有一个批处理文件 它从一个 txt 文件中获取输入 如下所示 Microsoft R Windows Script Host Version 5 8 Copyright C Microsoft Corporation All rights
  • System.String[] Split(Char[])' 方法无法识别

    我有以下数据 我想使用 Linq to Entities 过滤数据 但我收到异常 LINQ to Entities 无法识别方法 System String Split Char 方法 并且该方法不能翻译为 存储表达式 我的表中有以下数据
  • 为因子的每个级别附加一行总和

    我想为每个 Reg 添加一行总和 如下所示 Reg Res Pop 1 Total 1000915 2 A Urban 500414 3 A Rural 500501 4 Total 999938 5 B Urban 499922 6 B
  • UIPageViewController 在旋转时重置为第一页

    当用户旋转设备时 UIPageViewController从它显示的任何页面淡出回到第一页 这确实很烦人 尤其是当用户进入文档的多个页面时 它仅出现在 iOS 6 中 当用户旋转设备时 spineLocationForInterfaceOr
  • 如何分析Delphi应用程序中过多的内存消耗(PageFileUsage)?

    这是这个问题的后续 如何解释 FastMM 或 GetProcessMemoryInfo 报告的内存使用情况的差异 https stackoverflow com q 9704786 184404 我的 Delphi XE 应用程序使用大量
  • Visual Studio 大型解决方案

    我已经为我的 Web 应用程序提供了一个解决方案 其中包含近 12 个项目和 3 个网站 有一些项目用于多个网站 例如 MyProject BE MyProject BLL MyProject DAL MyProject Controls
  • 如何在程序中向scrapy爬虫传递参数?

    我是 python 和 scrapy 的新手 我用的是这个博客的方法以编程方式运行多个 scrapy 蜘蛛 http kirankoduru github io python multiple scrapy spiders html在烧瓶应
  • 设置目录的访问权限 - 接收异常“无法设置标志”

    我正在尝试编程允许对目录上的 ASPNET 帐户进行写访问 我使用以下代码来执行此操作 请注意 我希望 ASPNET 的 允许写入访问权限 也传播到子对象 static void Main string args FileSecurity
  • 我们可以依靠减少容量的技巧吗?

    它真的能保证以下减少容量的技巧在任何地方都能 起作用 吗 int main std string s lololololol s capacity still non zero string s swap s 它似乎对我来说 不起作用 因为
  • Hibernate 错误 - QuerySyntaxException:用户未映射 [来自用户]

    我试图从 用户 表中获取所有用户的列表 但出现以下错误 org hibernate hql internal ast QuerySyntaxException users is not mapped from users org hiber
  • Workbooks.OpenText 忽略 FieldInfo 列参数

    我有以下行来导入 csv 格式文件 Workbooks OpenText Filename sPath DataType xlDelimited Comma True FieldInfo Array Array 18 5 Array 19
  • 是否有任何 C 库为 GNU/Linux 实现 C11 线程?

    曾经有过a lot关于 C11 和 C11 线程的问题 但我在任何地方都没有看到明确的答案 Does anyC 库实现了可在 GNU Linux 上使用的 C11 线程接口吗 例如 提供 可选
  • 如何通过代码阅读所有共享的谷歌阅读器提要?

    我在我的谷歌阅读器上分享了很多提要 我想要一些使用 asp net 的代码来读取所有这些提要并放入页面中 可能需要分页 因为提要太多 有人知道该怎么做吗 或者是否有一个工具可以做到这一点 您可以使用RSS工具包 http blogs msd
  • 创建和删除索引后 MySQL 性能提升

    我有一个大型 MySQL MyISAM 表 大约有 400 万行 在 core 2 duo 8G RAM 笔记本电脑上运行 该表有 30 列 包括 varchar decimal 和 int 类型 我在 varchar 16 上有一个索引