簡體   English   中英

用於 MySQL 的 MEMORY 存儲引擎的替代品

[英]Alternatives to the MEMORY storage engine for MySQL

我目前正在針對 MyISAM 表運行一些密集的 SELECT 查詢。 該表大約有 100 MiB(800,000 行)並且它永遠不會改變。

我需要提高腳本的性能,所以我正在考慮將表從 MyISAM 移動到 MEMORY 存儲引擎,這樣我就可以將它完全加載到 memory 中。

除了 MEMORY 存儲引擎之外,還有哪些選項可以將 100 MiB 表加載到 memory 中?

無論您使用什么存儲引擎,對於 mysql 來說,一個有 800k 行的表應該沒有任何問題。 大小為 100 MB 的完整表(數據和鍵)應位於 memory(mysql 鍵緩存、操作系統文件緩存或兩者中)。

首先,您檢查索引。 在大多數情況下,優化索引會給您帶來最佳的性能提升。 永遠不要做任何其他事情,除非你很確定它們的形狀。 使用EXPLAIN調用查詢並注意未使用索引或使用錯誤索引的情況。 這應該使用真實世界的數據而不是在具有測試數據的服務器上完成。

優化索引后,查詢應在幾分之一秒內完成。 如果查詢仍然太慢,那么只需嘗試通過在應用程序中使用緩存(memcached 等)來避免運行它們。 鑒於表中的數據永遠不會改變,舊的緩存數據等應該沒有任何問題。

假設數據很少更改,您可以使用MySql 查詢緩存來顯着提高查詢的性能。

如果您的表被大量查詢,它可能已經在操作系統級別緩存,具體取決於您的服務器中有多少 memory。

MyISAM 還允許使用稱為MyISAM 密鑰緩存的機制將 MyISAM 表索引預加載到 memory 中。 創建鍵緩存后,您可以使用CACHE INDEXLOAD INDEX語法將索引加載到緩存中。

我假設您已經分析了您的表和查詢並在實際查詢之后優化了您的索引? 否則,在嘗試將整個表存儲在 memory 中之前,您確實應該這樣做。

如果您有足夠的 memory 分配給 Mysql 使用 - 在 Innodb 緩沖池中,或供 MyIsam 使用,您可以將數據庫讀入 memory(只是一個 'SELECT * from tablename'),如果沒有理由刪除它,它會保留那里。

您還可以獲得更好的密鑰使用,因為 MEMORY 表只執行哈希鍵,而不是完整的 btree 訪問,對於較小的非唯一鍵可能足夠胖,或者對於這么大的表來說不夠。

像往常一樣,最好的做法是對其進行基准測試。

另一個想法是,如果您使用的是 v5.1,則使用 ARCHIVE 表類型,它可以被壓縮,並且還可以加快對內容的訪問速度,如果它們易於壓縮的話。 這會交換 CPU 時間來解壓縮以進行 IO/內存訪問。

如果數據從不改變,您可以輕松地將表復制到多個數據庫服務器上。

這樣,您可以將一些查詢卸載到不同的服務器,為主服務器獲得一些額外的喘息空間。

速度提升取決於當前的數據庫負載,如果您的數據庫負載非常低,則不會有任何提升。

PS:
您知道 MEMORY 表在數據庫重新啟動時會忘記它們的內容!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM