簡體   English   中英

用於插入和選擇的不同表

[英]different table for insert and select

為了提高插入性能和服務器上的負載,我決定將一個大表分成2個。一個大表僅用於“選擇”,另一個小表主要用於“插入”,有時也“選擇”。 每個時間段(我考慮了一天),我都會將較小的表合並為較大的表。

重塑大表:是否可以通過告訴mysql服務器為只讀狀態來提高性能? 考慮到它僅用於選擇,我可以假設它將在不到1秒的時間內處理SELECT。 什么時候會變成〜1e9行?

關於小桌子:我應該在這里進行任何調整嗎? 從小表到大表(在php中)開發自動合並過程的最佳方法是什么?

我已經看到了為此目的而使用的這種策略和類似策略,但它總是適得其反。 最終,您將獲得更多開銷,從而造成了復雜性。 例如,您保證每個記錄至少插入兩次。

在進行過多討論之前,請務必仔細進行基准測試並進行比較以確認您的假設。

我發現規避MyISAM表上的刪除是非常有效的。 例如,您可以每天切換到一個新的小表,並且一旦兩者都是只讀的,則將舊表合並為大表。 然后丟棄舊的。 一旦刪除開始出現在MyISAM表中,其效率就會因必須查找和重復使用空洞而大大降低。

Konerak關於打包ISAM表的建議是對這種觀點的很好補充。 一種效果是,它為您提供了沒有孔的表(和索引)。

我相信您不需要這個。

如果您的目標是賦予SELECT查詢更高的優先級,則可以使用INSERT DELAYED進行插入。

打包的ISAM表非常適合作為MySQL只讀表,但是對於繁重的查詢,您仍然需要正確的索引。

但是請確保這是解決問題的方法(並考慮了其他選項,包括索引和分區)

我認為您不需要為SELECT和INSERT維護不同的表,主要是因為如果INSERT的數量不是很大或不是很頻繁。 如果表具有正確的索引,則SELECT將很有效。 但是請注意,太多索引可能會殺死INSERT。

通過維護不同的表,我認為這對服務器負載沒有任何好處,因為每條記錄總會有2個INSERT運行。

如果您認為SELECT具有更高的優先級,那么您可能還想研究INSERT DELAYED,但是我建議您在使用它們之前先充分閱讀它們。

我還將建議您使用InnoDB,因為它使用行級鎖定。

您也可以嘗試分區。 我認為您的情況可能是水平分區。 盡管我承認我自己沒有使用它的經驗。

但是,如果拆分表是您認為最好的選擇,我建議您探索其他替代方法。 與將數據從INSERT表遷移到SELECT表不同,您可以對INSERT和SELECT使用同一表,但是要維護多個表,例如每個月一個表或其他適合您的條件。 然后,您可以構建邏輯來決定要在哪個表上運行查詢。 您最終還可以合並舊表以創建一個大表,然后刪除舊表。

暫無
暫無

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

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