2012-05-21 58 views
34

我注意到我的數據庫服務器支持Memory數據庫引擎。我想創建一個數據庫,我已經使InnoDB在內存中完全運行,以提高性能。如何讓MySQL數據庫在內存中完全運行?

我該怎麼做?我探索了PHPMyAdmin,並且找不到「更改引擎」功能。

+3

你應該首先了解你在那裏做什麼。使用內存引擎有一定的含義。 – usr

+2

在內存中運行意味着只要重新啓動MySQL守護進程(或崩潰)就會擦除數據,那麼最好使用query_cache for MySQL或memcached來緩存結果 – Mikey

+1

我不確定這是什麼你要。你的表現問題到底是什麼? – Mario

回答

18

假設您瞭解使用備註中提及的MEMORY引擎的後果,以及here以及通過搜索(無事務安全性,鎖定問題等)可找到的其他一些內容 - 您可以按以下步驟操作:

內存表的存儲方式與InnoDB不同,因此您需要使用導出/導入策略。首先使用SELECT * FROM tablename INTO OUTFILE 'table_filename'將每個表單獨轉儲到一個文件。創建MEMORY數據庫並使用以下語法重新創建您將使用的表格:CREATE TABLE tablename (...) ENGINE = MEMORY;。然後您可以使用LOAD DATA INFILE 'table_filename' INTO TABLE tablename爲每個表導入數據。

+0

downvoter是否會關心評論? – PinnyM

+29

這實際上並沒有說如何創建一個內存數據庫或表。 –

+8

對於由@INTPnerd創建的點,在重新創建表時,請使用以下語法:CREATE TABLE someTable(...)ENGINE = MEMORY;' – PinnyM

5

如果您的數據庫足夠小(或者您添加了足夠的內存),那麼您的數據庫將在內存中有效運行,因爲它將在第一次請求後緩存您的數據。

將數據庫表定義更改爲使用內存引擎可能比您需要的更復雜。

如果您有足夠的內存將表加載到內存中並使用MEMORY引擎,則足以調整innodb設置以緩存所有內容。

9

內存引擎不是您正在尋找的解決方案。你首先失去了去數據庫的所有東西(即ACID)。

這裏有一些更好的選擇:

  1. 不要使用聯接 - 很少有大的應用程序做到這一點(即谷歌,Flickr後,Netflix公司),因爲它吸收了大套的聯接。
  2. 確保您查詢的列有索引。使用EXPLAIN確認他們正在使用。
  3. 使用並增加您的Query_Cache和內存空間爲您的索引獲取它們在內存中並存儲頻繁的查找。
  4. 非規範化您的模式,特別是對於簡單的連接(即從barMap獲取fooId)。

最後一點是關鍵。我曾經喜歡加入,但後來不得不在100M +行的幾張桌子上加入連接。不好。最好將你加入的數據插入到目標表(如果它不是太多)並且對索引列進行查詢,你會在幾ms內得到你的查詢。

我希望那些幫助。

+9

最後一點對於性能可能非常好,但如果使用不當,它可能會成爲數據一致性和維護的殺手。觸發器更新或類似的緩存複製策略可以幫助那裏,但緩存非規範化數據的方式不應被視爲理所當然...... – PinnyM

+3

@PinnyM好點。這是人們必須決定什麼是最重要的地方。 RDBMS非常適合原子性和一致性,但不適合縮放和性能,尤其是連接。 6NF(星圖)非常正常,但加入快樂。您仍然可以按照規範化的方式將數據保留在某些表中,並使用觸發器和計劃任務從規範化表(讀/寫)更新非規範化(只讀)表。 –

+1

1和4是有史以來最糟糕的建議。 – Darwin

4

「我該怎麼辦呢?我探索的phpMyAdmin,我不能找到一個‘變革引擎’的功能。「

在你的問題,這部分直接回應,你可以發出一個ALTER TABLE tbl engine=InnoDB;,它會重新創建表在適當的引擎。

12

它也可以將MySQL數據目錄中的tmpfs中從而加快數據庫的寫入和讀取的電話。這也許不是這樣做的最有效的方式,但有時你不能只是改變存儲引擎。

這裏是我的MySQL數據我的fstab條目目錄

none   /opt/mysql/server-5.6/data tmpfs defaults,size=1000M,uid=999,gid=1000,mode=0700   0  0 

我也寫了一篇文章,更詳細地解釋了設置。我使用這個設置進行數據庫測試。

http://jotschi.de/2014/02/03/high-performance-mysql-testdatabase/

您可能還需要看一看在的innodb_flush_log_at_trx_commit = 2設置。也許這會加速你的MySQL足夠。

innodb_flush_log_at_trx_commit更改mysql磁盤刷新行爲。當設置爲2時,它只會每秒刷新緩衝區。默認情況下,每個插入都會導致刷新,從而導致更多的IO負載。

+0

你可能也想看看libeatmydata。它可以防止fsync和較舊的同步調用,從而加速應用程序。 https://www.flamingspork.com/projects/libeatmydata/ (apt-get install eatmydata; eatmydata /etc/init.d/mysql restart) – Jotschi

+0

我在想整個mysql在內存中,另一個mysql實例來複制和保存數據。當然,假設我可以處理數據鬆散的風險,因爲複製延遲。 –

相關問題