2011-12-22 13 views
2

私は現在データベースを最適化しようとしています。問題は次のとおりです。 私は現在83Mio以上のテーブルを持っています。時系列の値。それらはhighres(ms)のタイムスタンプによって索引付けされます。私がしなければならないことは、一定の時間間隔に一定の値が何回現れるかを数えることです。例えば、1.56787の値がタイムスタンプxからタイムスタンプyまでの間に何回出現したか知りたいとします。今はこれがほぼ永遠に続く。 私はInnoDBを使用しています。私はすでに設定ファイルを最適化するのに多くの時間を割いています。MySQLデータベースを最適化するための最適化

私はかなりのアイデアからどのようにこれをプルするために実行中のすべての入力に感謝します。私が考えることができる唯一の回避策は、固定間隔の事前カウントされた値を含むテーブルを作成することです。実際には完全に更新可能である必要があります(数ミリ秒ごとに新しい値が到着するということです)。別のDBシステムが私の問題にどのように適していますか?

Field Type Null Key Default Extra 

timestamp bigint(20) NO PRI NULL  
ask decimal(6,5) NO  NULL  
bid decimal(6,5) NO  NULL  
askvolume decimal(6,5) NO  NULL  
bidvolume decimal(6,5) NO  NULL  

# The MySQL server 
[mysqld] 
port= 3306 
socket= "C:/xampp/mysql/mysql.sock" 
basedir="C:/xampp/mysql" 
tmpdir="C:/xampp/tmp" 
datadir="C:/xampp/mysql/data" 
pid_file="mysql.pid" 
skip-external-locking 
key_buffer = 16M 
max_allowed_packet = 61M 
table_cache = 64 
sort_buffer_size = 512K 
net_buffer_length = 8K 
read_buffer_size = 256K 
read_rnd_buffer_size = 512K 
myisam_sort_buffer_size = 8M 
log_error="mysql_error.log" 
bind-address="192.168.1.2" 


# Don't listen on a TCP/IP port at all. This can be a security enhancement, 
# if all processes that need to connect to mysqld run on the same host. 
# All interaction with mysqld must be made via Unix sockets or named pipes. 
# Note that using this option without enabling named pipes on Windows 
# (via the "enable-named-pipe" option) will render mysqld useless! 
# 
# commented in by lampp security 
#skip-networking 
skip-federated 

# Replication Master Server (default) 
# binary logging is required for replication 
# log-bin deactivated by default since XAMPP 1.4.11 
#log-bin=mysql-bin 

# required unique id between 1 and 2^32 - 1 
# defaults to 1 if master-host is not set 
# but will not function as a master if omitted 
server-id = 1 

# Replication Slave (comment out master section to use this) 
# 
# To configure this host as a replication slave, you can choose between 
# two methods : 
# 
# 1) Use the CHANGE MASTER TO command (fully described in our manual) - 
# the syntax is: 
# 
# CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>, 
# MASTER_USER=<user>, MASTER_PASSWORD=<password> ; 
# 
# where you replace <host>, <user>, <password> by quoted strings and 
# <port> by the master's port number (3306 by default). 
# 
# Example: 
# 
# CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306, 
# MASTER_USER='joe', MASTER_PASSWORD='secret'; 
# 
# OR 
# 
# 2) Set the variables below. However, in case you choose this method, then 
# start replication for the first time (even unsuccessfully, for example 
# if you mistyped the password in master-password and the slave fails to 
# connect), the slave will create a master.info file, and any later 
# change in this file to the variables' values below will be ignored and 
# overridden by the content of the master.info file, unless you shutdown 
# the slave server, delete master.info and restart the slaver server. 
# For that reason, you may want to leave the lines below untouched 
# (commented) and instead use CHANGE MASTER TO (see above) 
# 
# required unique id between 2 and 2^32 - 1 
# (and different from the master) 
# defaults to 2 if master-host is set 
# but will not function as a slave if omitted 
#server-id  = 2 
# 
# The replication master for this slave - required 
#master-host  = <hostname> 
# 
# The username the slave will use for authentication when connecting 
# to the master - required 
#master-user  = <username> 
# 
# The password the slave will authenticate with when connecting to 
# the master - required 
#master-password = <password> 
# 
# The port the master is listening on. 
# optional - defaults to 3306 
#master-port  = <port> 
# 
# binary logging - not required for slaves, but recommended 
#log-bin=mysql-bin 


# Point the following paths to different dedicated disks 
#tmpdir = "C:/xampp/tmp" 
#log-update = /path-to-dedicated-directory/hostname 

# Uncomment the following if you are using BDB tables 
#bdb_cache_size = 4M 
#bdb_max_lock = 10000 

# Comment the following if you are using InnoDB tables 
#skip-innodb 
innodb_data_home_dir = "C:/xampp/mysql/data" 
innodb_data_file_path = ibdata1:10M:autoextend 
innodb_log_group_home_dir = "C:/xampp/mysql/data" 
#innodb_log_arch_dir = "C:/xampp/mysql/data" 
## You can set .._buffer_pool_size up to 50 - 80 % 
## of RAM but beware of setting memory usage too high 
innodb_buffer_pool_size = 1024M 
innodb_additional_mem_pool_size = 20M 
## Set .._log_file_size to 25 % of buffer pool size 
innodb_log_file_size = 5M 
innodb_log_buffer_size = 16M 
innodb_flush_log_at_trx_commit = 0 
innodb_lock_wait_timeout = 50 

[mysqldump] 
quick 
max_allowed_packet = 16M 

[mysql] 
no-auto-rehash 
# Remove the next comment character if you are not familiar with SQL 
#safe-updates 

[isamchk] 
key_buffer = 20M 
sort_buffer_size = 20M 
read_buffer = 2M 
write_buffer = 2M 

[myisamchk] 
key_buffer = 20M 
sort_buffer_size = 20M 
read_buffer = 2M 
write_buffer = 2M 

[mysqlhotcopy] 
interactive-timeout 

ああマシンはRAM 6GBのとi7-950であり、システム+データベースがSSDである:ここで

は出力を説明しています。だから私はそれが問題ではないと思いますか?

ご協力いただきありがとうございます。

+0

は問題ではありませんオプションでお金を投げていますか?あなたはパフォーマンスを向上させるために多くを行うことができ、より多くのお金は私の最初の選択ではありません...しかし、いくつかの点では、より良いハードウェアを取得する必要があります。あなたの説明によると、あなたはその点に近づいているようです。それは言われました...私は(よく構成された)Postgresにショットを与えることを強くお勧めします。 – shesek

+0

MySQlインスタンスを実行するために使用するテーブルやハードウェアが表示されていないため、何か提案するのは難しいです。また、PostgresがI/Oバウンドシステムに何か変わることはないと考えています。特に、InnoDBのBツリー実装が業界最高のものだと分かっています。ロングショットで判断するRDBMS全体をスワップすることは、実行可能な選択肢ではありません。私はMySQLが正しく設定されていないと賭けています( 'SHOW VARIABLES LIKE '%innodb%'と' EXPLAIN ... 'の出力が存在しませんでした)。それらを投稿できれば、何が間違っているのかを簡単に分析できます。 –

+0

ありがとう、私は説明にすべての情報を追加しました...必要であれば、キャッシュを入れるのは問題ではありませんが、私が投稿したように、ssdと6GB RAMを持つi7 ... – user871784

答えて

-1

最初のステップ:実行していない場合は、Explainプランを使用してクエリのボトルネックを正確に確認し、エンジンがインデックスを正しく使用しているかどうかを確認します。

第2ステップ:タイムスタンプの範囲でテーブルをパーティション分割します。 MySQL/InnoDBにその機能があるかどうかはわかりませんが、そうでなければDBMSを変更してください。

いずれにせよ、MySQLは高性能のための本当の選択肢ではありません。必要に応じて、OracleやPostgre、さらにはメモリ内のストレージを使用する方が良いかもしれません(特に、あまり気にしない性能とは対照的に安全性のために)。

+0

InnoDBは動作中のデータセットをメモリに保存し、メモリ内の特定のソリューションよりもはるかに高速に動作します。 PostgresやOracleは高速化しません。それは、システムのI/Oを最適化し、クエリがそれを長く取る理由を見ることの問題です。 –

+0

私は、InnoDBがH2より高速であることを心から疑っています(そして、そうではないと言います、それは価値があります:http://www.h2database.com/html/performance.html)。それでも、明らかにRDBMSを切り替えることは、最も単純な解決策ではなく、考慮する必要がありますが、言及する価値はあります。 – Viruzzo

+0

InnoDB @ 5.6は高速であり、リンクしたベンチマークでは、MySQLのケースでは140文/秒で、小テストのxeonと7200rpmのドライブよりも遅いことが示されています。私は、他のシステムに対してすぐに使用できるベンチマークを信頼していません。さらに、MySQL用の列ベースの分析エンジンが特化しており、Oracleよりも高速に実行できます。問題はなぜ100万ミリアンペア未満のデータベースかということです。レコードが遅いので、dbシステムを変更することなくInnoDBの非常に多くの行で非常に迅速な結果を得ることができるという事実を知っています。 –

0

タイムスタンプの値をインデックス化した値の範囲がわかりませんが、partitioningテーブルがここに表示されるようです。具体的にはRANGE partitioningまたはHASH partitioningです。

これにより、パフォーマンスが大幅に向上します。

+0

ハッシュパーティショニングは望ましくありません。パーティション内のデータの均等な分配(ハッシュ)を保証しますが、インターバルクエリ(彼が行ったようなもの)では特別な利点はありませんが、レンジパーティションが最も確実です。 – Viruzzo

+0

あなたの提案をありがとう、私は今掘るためにかなりのものがあると思う! – user871784

0

時間範囲を一連の範囲(月、日、週など)として表すことができる場合は、IN()式を使用して検査済み行の数を大幅に減らすdate-prefix列を導入することがあります。ここで

は、アイデアを公開記事です:http://www.mysqlperformanceblog.com/2010/01/09/getting-around-optimizer-limitations-with-an-in-list/

+0

あなたの返信ありがとう!上記の説明の出力を掲載しました。私はdefiniteleyあなたのリンクを見てみましょう! – user871784