2017-07-09 5 views
0

私は初めてMySQLを使用しており、SQL Server Expressと比較して基本クエリが完了するまでの時間に驚いています。私はデータベースについては初心者ですので、シンタックスや設定で基本的なものを変更して "仕事"にすることができれば嬉しいです。mySQLはこれを長く取るべきですか、設定が間違っていますか?

私はmySQL 5.7、Workbench 6.3を使用しています。サーバー/クライアントは同じローカルマシン上にあり、1人のユーザー(ルート)のみです。

この例を取っ​​てください。

CREATE TABLE original_table 
(
    myTimeStamp datetime, 
    PRIMARY KEY (`myTimeStamp`) 
); 

は楽しみのために、私は2009年から2017年= 420万件のレコードを1分間隔で連続的な日付時刻を持つテーブルを埋め:私は、単純なテーブルを持っています。さて、単純にそのテーブルを別の新しいテーブルにコピーするには、272秒が必要です。

CREATE TABLE new_table AS SELECT * FROM original_table 

とINSERTでそれをしようと209秒取ります

Windowsのタスクマネージャを見ると
CREATE TABLE new_table LIKE original_table; 
INSERT new_table SELECT * FROM original_table; 

をCPUが過去行かないので、驚くべきことである容量とのmysqldの4%しか0.1-2を取りますCPUの%。 WorkbenchはCPUの0.3%を使用します。

興味深いCLUE:

:私が代わりに一時テーブルにコピーしようとした場合、タスクが完了すると10倍の速さ( 22秒)、およびWindowsタスクマネージャは、mysqldを示しては、CPUの5〜10%のかかります
CREATE temporary TABLE newTemp LIKE original_table; 
INSERT newTemp SELECT * FROM original_table; 

何が起こっているのか、またはこれがmySQLのパフォーマンスですか?

答えて

0

MySQLは高度に構成可能なDBです。ご使用のハードウェアと使用方法に合わせて最適な設定になっていない可能性があります。この記事では、InnoDBの設定に関するいくつかの兆候を示しています。https://www.percona.com/blog/2007/11/01/innodb-performance-optimization-basics/

実験のためだけにこれらのコマンドを実行してから、テーブルの埋め込みをやり直して時間が短縮されているかどうかを確認してください。一時表への挿入は、通常の表への挿入がすべての挿入文の後にディスクにコミットされている間は、一時表がメモリー内にとどまるため、より高速です。

set global innodb_flush_log_at_trx_commit=2 
set global general-log=0 

上記の実験を完了したら、挿入をトランザクションに囲みましょう。それが違いを生むかどうかは分かりませんが、見つけ出すためだけです。

start transaction; 
--- your insert sql 
commit; 
+0

ありがとうございました。それは68秒に改善されました。あなたが投稿した記事を読んで、もっと構成できるかどうかを確認します。最適な構成では、標準の家庭用コンピュータ(3.2 GHz)を使用すると、このようなものがどれくらいの期間は必要ですか?私は特定の数字ではなく、5秒か50秒で話しているのですか? – MikeD

+0

@MikeD実験しているデータ挿入のタイプはルーチンではありません。 MySQLにははるかに高速なバッチインサートがあります。典型的なデータベースベースのアプリケーションでは、挿入/更新クエリと比較してはるかに多くの読み取りクエリがあります。このようなシナリオでは、DBを最適化して読み込みを高速化する必要があります。 –

関連する問題