2

我正在开发一个用 NodeJS 编写的 API,并连接到 MySQL 5.5 数据库。在我们的实时系统上,我们有一个运行时间超过 7 秒的查询。我们已将此追溯到几个表,其中包含超过 500 万条记录且索引不正确。

在我们的开发区,我们没有那么多记录。我想我已经确定了导致问​​题的查询,但是没有在我的笔记本电脑上放置 500 万条记录(这需要很长时间才能生成),我无法证明这一点。

是否有一种设置/技术可以用来模拟拥有数百万条数据库记录而实际上没有记录?

4

3 回答 3

2

您可以编写 Perl 或 Python 脚本来填充您的大型测试表。如果您将其作为单笔交易进行,则不会花费很长时间。

如果generate_series()PostgreSQL 支持 MySQL,那么不编写脚本会容易得多,但不幸的是,它没有:(。

但是,您仍然可以在 MySQL(或任何其他 SQL 数据库)中轻松创建大表,而无需编写脚本。主要思想是这样使用INSERT INTO ... SELECT

CREATE TABLE mytable (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(16)
);
INSERT INTO mytable(name) VALUES ('Blah');
INSERT INTO mytable(name) SELECT name FROM mytable;
INSERT INTO mytable(name) SELECT name FROM mytable;
...

请注意,每个下一个都会使表格大小INSERT 翻倍。

使用这种方法,这个SQLFiddle在不到 5 秒的时间内使用大约 20 行 SQL创建了100 万个测试行。

于 2013-04-11T09:18:33.247 回答
0

在 Oracle 中,您可以将表统计信息加载到其他数据库 - 即生产到开发 - 实际上,模拟在执行解释计划等操作时使用的数据量。在 MySQL 下是否存在等效的东西可能值得一看。它并不完美,但可以让您更好地了解引擎盖下发生的事情。

对不起,我不能更具体,我刚刚醒来,我还没有喝茶。

于 2013-04-11T08:48:37.633 回答
0

我最初的想法是将大量数据放入数据库以突出问题。我设法获得了一百万条记录,只需留下一个脚本一夜之间敲击(开发)API。

EXPLAIN 功能非常有用。我还发现 EXPLAIN EXTENDED 也非常有用。但是,这些都没有突出问题,因为它不是索引问题。

我还发现“RESET QUERY CACHE”功能很有用,因为它清除了缓存数据以进行调试。

一些 numty 在那里放了一个“WHERE DATE_FORMAT() = ''”。虽然对我花了多长时间才注意到它感到非常恼火(那是周五下午——请善待),但我发现并解决了这个问题。谢谢大家。

这个故事的寓意是:永远不要在条款中坚持功能!

于 2013-04-12T15:44:39.613 回答