2

NodeJS で記述され、MySQL 5.5 データベースに接続する API に取り組んでいます。私たちのライブ システムでは、7 秒以上実行されているクエリが 1 つあります。これは、500 万を超えるレコードがあり、誤ってインデックス付けされたいくつかのテーブルにまで遡ります。

私たちの開発エリアでは、その数のレコードはありません。問題の原因となっているクエリを特定したと思いますが、ラップトップに 500 万件のレコード (生成には時間がかかります) を配置するまでは、それを証明することはできません。

実際にレコードを入れずに、何百万ものデータベース レコードをエミュレートするために使用できる設定/テクニックはありますか?

4

3 に答える 3

2

Perl または Python スクリプトを記述して、大きなテスト テーブルにデータを入力できます。単一のトランザクションとして実行する場合、それほど時間はかかりません。

MySQL がgenerate_series()PostgreSQL でサポートされていれば、スクリプトを作成しなくてもはるかに簡単に実行できたでしょうが、残念ながらそうではありません :(.

ただし、スクリプトを作成しなくても、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 2 倍になることに注意してください。

このアプローチを使用して、このSQLFiddleは、約 20 行の SQL を使用して5 秒未満で100 万のテスト行を作成します。

于 2013-04-11T09:18:33.247 に答える
0

Oracle では、テーブル統計を他のデータベース (つまり、本番から開発) にロードして、実行計画などを実行するときに使用されるデータ ボリュームを実際にモックすることができます。MySQL に同等のものが存在するかどうかを確認する価値があるかもしれません。完璧ではありませんが、内部で何が起こっているかをよりよく理解できるでしょう。

すみません、もっと具体的に言えません。起きたばかりで、まだお茶を飲んでいません。

于 2013-04-11T08:48:37.633 に答える
0

私の最初の考えは、問題を強調するためにデータベースに大量のデータを取得することでした。(dev)API を一晩中叩き続けるスクリプトをそのままにしておくだけで、100 万件のレコードを取得することができました。

EXPLAIN 関数はかなり役に立ちました。また、EXPLAIN EXTENDED も非常に便利であることがわかりました。ただし、インデックス作成の問題ではないため、これらのいずれも問題を強調していません。

また、「RESET QUERY CACHE」機能が便利であることがわかりました。これは、デバッグ目的でキャッシュされたデータを消去するためです。

そこに "WHERE DATE_FORMAT() = ''" を入れたものがあります。それに気付くのに時間がかかったことにかなり腹を立てていましたが(金曜日の午後でした-親切にしてください)、私は問題を見つけて修正しました. 皆さんありがとう。

この話の教訓は次のとおりです。

于 2013-04-12T15:44:39.613 に答える