我注意到我的數據庫服務器支持Memory數據庫引擎。我想創建一個數據庫,我已經使InnoDB在內存中完全運行,以提高性能。如何讓MySQL數據庫在內存中完全運行?
我該怎麼做?我探索了PHPMyAdmin,並且找不到「更改引擎」功能。
我注意到我的數據庫服務器支持Memory數據庫引擎。我想創建一個數據庫,我已經使InnoDB在內存中完全運行,以提高性能。如何讓MySQL數據庫在內存中完全運行?
我該怎麼做?我探索了PHPMyAdmin,並且找不到「更改引擎」功能。
假設您瞭解使用備註中提及的MEMORY引擎的後果,以及here以及通過搜索(無事務安全性,鎖定問題等)可找到的其他一些內容 - 您可以按以下步驟操作:
內存表的存儲方式與InnoDB不同,因此您需要使用導出/導入策略。首先使用SELECT * FROM tablename INTO OUTFILE 'table_filename'
將每個表單獨轉儲到一個文件。創建MEMORY數據庫並使用以下語法重新創建您將使用的表格:CREATE TABLE tablename (...) ENGINE = MEMORY;
。然後您可以使用LOAD DATA INFILE 'table_filename' INTO TABLE tablename
爲每個表導入數據。
如果您的數據庫足夠小(或者您添加了足夠的內存),那麼您的數據庫將在內存中有效運行,因爲它將在第一次請求後緩存您的數據。
將數據庫表定義更改爲使用內存引擎可能比您需要的更復雜。
如果您有足夠的內存將表加載到內存中並使用MEMORY
引擎,則足以調整innodb設置以緩存所有內容。
內存引擎不是您正在尋找的解決方案。你首先失去了去數據庫的所有東西(即ACID)。
這裏有一些更好的選擇:
最後一點是關鍵。我曾經喜歡加入,但後來不得不在100M +行的幾張桌子上加入連接。不好。最好將你加入的數據插入到目標表(如果它不是太多)並且對索引列進行查詢,你會在幾ms內得到你的查詢。
我希望那些幫助。
代替內存存儲引擎,可以考慮MySQL簇。據說它具有類似的性能,但支持磁盤操作以提高耐用性。我沒有嘗試過,但它看起來很有前途(並且已經開發了很多年)。
「我該怎麼辦呢?我探索的phpMyAdmin,我不能找到一個‘變革引擎’的功能。「
在你的問題,這部分直接回應,你可以發出一個ALTER TABLE tbl engine=InnoDB;
,它會重新創建表在適當的引擎。
它也可以將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負載。
你可能也想看看libeatmydata。它可以防止fsync和較舊的同步調用,從而加速應用程序。 https://www.flamingspork.com/projects/libeatmydata/ (apt-get install eatmydata; eatmydata /etc/init.d/mysql restart) – Jotschi
我在想整個mysql在內存中,另一個mysql實例來複制和保存數據。當然,假設我可以處理數據鬆散的風險,因爲複製延遲。 –
你應該首先了解你在那裏做什麼。使用內存引擎有一定的含義。 – usr
在內存中運行意味着只要重新啓動MySQL守護進程(或崩潰)就會擦除數據,那麼最好使用query_cache for MySQL或memcached來緩存結果 – Mikey
我不確定這是什麼你要。你的表現問題到底是什麼? – Mario