2014-02-18 57 views
1

TokuDB和InnoDB插入很慢我已經準備好下面的SQL語句來比較的MyISAM,InnoDB的,和TokuDB(INSERT爲100000次執行)的性能行爲:爲什麼相比MyISAM

的MyISAM:

CREATE TABLE `testtable_myisam` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `value1` INT DEFAULT NULL, `value2` INT DEFAULT NULL, PRIMARY KEY (`id`), KEY `index1` (`value1`)) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `testtable_myisam` (`value1`, `value2`) VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 1000)); 

InnoDB的:

CREATE TABLE `testtable_innodb` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `value1` INT DEFAULT NULL, `value2` INT DEFAULT NULL, PRIMARY KEY (`id`), KEY `index1` (`value1`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `testtable_innodb` (`value1`, `value2`) VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 1000)); 

TokuDB:

CREATE TABLE `testtable_tokudb` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `value1` INT DEFAULT NULL, `value2` INT DEFAULT NULL, PRIMARY KEY (`id`), KEY `index1` (`value1`)) ENGINE=TokuDB DEFAULT CHARSET=utf8; 

INSERT INTO `testtable_tokudb` (`value1`, `value2`) VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 1000)); 

開始時,InnoDB的INSERT性能比MyISAM慢50倍,TokuDB比MyISAM慢40倍。

然後我在InnoDB上找出「innodb-flush-log-at-trx-commit = 2」的設置,使其INSERT行爲與MyISAM類似。

問題是,我應該在TokuDB上做什麼?我敢打賭,TokuDB的可憐INSERT性能也是由一些不合適的設置引起的,但我無法弄清楚原因。

--------- --------- UPDATE

由於tmcallaghan的評論,我已經修改我的設置爲 「tokudb_commit_sync = OFF」,現在插入TokuDB率在小數據集上似乎是有意義的(一旦我找出以下問題,我將在大數據集上執行它們):

但是,與MyISAM和InnoDB相比,TokuDB的選擇性能仍然是有線的,被我的模擬器替換爲不同的Int):

SELECT id, value1, value2 FROM testtable_myisam WHERE value1=?; 
SELECT id, value1, value2 FROM testtable_innodb WHERE value1=?; 
SELECT id, value1, value2 FROM testtable_tokudb WHERE value1=?; 

在一百萬個數據集中,每個10k SELECT語句單獨由MyISAM和InnoDB花費10和15秒,但TokuDB需要大約40秒。

我是否錯過其他一些設置?

在此先感謝!

+0

Offtopic。不是一個編程問題。這是更多的數據庫配置/調整。請嘗試使用DBA站點。 –

+0

set unique_checks = off; ?? – Hackerman

回答

3

爲什麼交易引擎是比較慢的原因是因爲他們迫使硬盤,以確認它寫了下來的數據。爲了讓硬盤寫入數據,必須將磁頭放置在磁盤平板上並傳輸數據。每筆交易都意味着磁盤將磁針置於磁頭上,寫下數據並告訴操作系統它確實存在。

事務引擎這樣做的原因是它們可以符合ACID的D部分。他們確保你想要寫下的數據,實際上是永久寫下來的。 MyISAM不這樣做。

因此,插入的速度與硬盤的每秒輸入輸出操作數(IOPS)成正比。這也意味着,如果您在一次事務中包裝多個查詢,則可以利用所提到的驅動器的寫入速度帶寬。另外,這也意味着具有高IOPS(例如SSD)的驅動器具有40,000以上的IOPS,而機械系列的範圍約爲250-300,但不要以我的名字來表示確切的數字)。長話短說,如果您想要使用事務引擎真正快速插入 - 在單個事務中包裝多個查詢。 您所做的所有「優化」都略微違反了ACID的D部分,因爲引擎會嘗試利用可用作緩衝區的各種快速內存。這意味着,如果出現問題,例如您失去了權力,請親吻您的數據。

另外,由您進行的測試實際上是不好的,因爲它們規模很小。 InnoDB和特別是TokuDB的設計都包含數百GB的數據並提供線性性能。

+0

這真的是很好的信息,並解決了MyISAM和InnoDB之間速度差異的問題,非常感謝!正如我剛剛發佈的評論,現在我清楚插入速度,但仍不明白爲什麼InnoDB和TokuDB的選擇速度較慢,特別是爲什麼TokuDB選擇幾乎是MyISAM的兩倍。 我的意思是在較大的數據集(10m-100m)上運行模擬,希望能得到不同的結果。 –

+0

度量通過使用TokuDB中的聚簇索引和主鍵與InnoDB進行選擇。通過增加變量'innodb_buffer_pool'確保InnoDB有足夠的內存。 100米並不是很大,我在生產中有大約50GB的InnoDB,而且我看到terrabyte-large InnoDB數據集的工作速度非常快。 –

4

這聽起來不像一個非常有趣的測試(100,000行不是很多,而且插入不是併發的),但是這裏是您正在尋找的設置。

正在發出「set tokudb_commit_sync = 0;」將在提交操作中關閉fsync()。請注意,在此模式下沒有耐久性保證。

正如我之前提到的,TokuDB的優勢是索引數據比RAM大得多,而這個測試不是。

+0

嗨tmcallaghan,感謝您的意見。真正的100萬是沒有系列的,我把這個作爲第一個測試,以確保所有以上的引擎具有可比較的性能,之後,我將推出一些更復雜的表結構和數十億行的大測試。 –

+0

然後你已經得到了答案,只有很少的數據MyISAM在你的測試中速度最快。實際上,當前所有的測試措施都是您的存儲系統的fsync()性能。用複雜的表格和數十億行進行的「大測試」將顯示非常不同的結果。 – tmcallaghan

+0

正如編寫的文章所寫,tokudb_commit_sync的確有助於提高插入率,謝謝!但是,查詢性能仍然比MyISAM和InnoDB慢一百萬個數據庫(慢大約3倍)。我又錯過了什麼(即使數據庫規模很小)? –

0

我已將my.cnf更新爲以下內容,現在整體性能看起來更好。

對於來自MyISAM的SELECT的10k次,它需要4秒,因此InnoDB需要5秒,而TokuDB需要8秒。因此,我可以總結出下面的配置,TokuDB與MyISAM和InnoDB的行爲相似(甚至不是更好)。

確實,我很好奇InnoDB vs.s之間的性能比較。 TokuDB,但不是MyISAM v.s. TokuDB,爲什麼?


tokudb_commit_sync=0 

max_allowed_packet = 1M 
table_open_cache = 128 
read_buffer_size = 2M 
read_rnd_buffer_size = 8M 
myisam_sort_buffer_size = 64M 
thread_cache_size = 8 
query_cache_size = 32M 
thread_concurrency = 8 

innodb_flush_log_at_trx_commit=2 
innodb_buffer_pool_size = 2G 
innodb_additional_mem_pool_size = 20M 
innodb_log_buffer_size = 8M 
innodb_lock_wait_timeout = 50 
相關問題