簡體   English   中英

MySql MyISAM INSERT緩慢

[英]MySql MyISAM INSERT slowness

在mysql表中插入一些數據時出現性能問題。 該表有一堆列,比如DATE,A,B,C,D,E,F,其中DATE,A,B,C,D,E是主鍵。 每天,我在該表中插入70k行(具有不同的日期),此表現在包含1800萬行。 我用來插入行的方法只是發送70k INSERT查詢。

我遇到的問題是查詢開始比以前花費更多的時間。 從幾分鍾到幾個小時。 我描述了插頁,這是我得到的圖表:

每個插入的速度(以秒為單位)與當天插入的數量: 每個插入的速度(以秒為單位)與當天的插入數量

一些奇怪的事實:

  1. 大多數查詢執行時間不到2毫秒
  2. 慢查詢的速度隨着該日期表中的行數線性增加
  3. 這種行為只發生在晚上,在數據庫上發生了一堆進程之后。 白天插入很快,周末也是如此
  4. 總體速度不依賴於數據庫上正在運行的其他內容,事實上,當發生這種情況時,數據庫上沒有其他任何內容正在運行
  5. 查詢中沒有任何內容可以解釋查詢是快還是不快,快速查詢與慢查詢非常相似,而且從一天到另一天不是同一組。
  6. 行為不會從一天變為另一天。

知道是什么原因引起的嗎?

**編輯**索引中的列按以下順序排列:

DATE NOT NULL,
DATE NOT NULL,
VARCHAR (10) NOT NULL,
VARCHAR (45) NOT NULL,
VARCHAR (45) NOT NULL,
VARCHAR (3) NOT NULL,
VARCHAR (45) NOT NULL,
DOUBLE NOT NULL,
VARCHAR (10) NOT NULL,
VARCHAR (45) NOT NULL,
VARCHAR (45) NOT NULL,
VARCHAR (45) NOT NULL,

日期要么與今天相同,要么留空,雙倍總是相同的數字(沒有設計此表的線索)

簡短的解釋是,您有一個在一天范圍內非增量的索引。 非增量索引通常較慢地插入/更新,因為它們通常需要重新平衡索引樹,並且在更大程度上需要比增量索引重新平衡。

為了進一步解釋這一點 - 假設以下架構:

a (int) | b (varchar)

索引是(a, b)

現在我們插入:

1, 'foo'
2, 'bar'
3, 'baz'

這將非常快,因為索引將附加在每個插入上。 現在讓我們嘗試以下方法:

100, 'foo'
100, 'bar'
100, 'baz'

這不會那么快,因為'bar'需要在'foo'之前插入,'baz'需要在另一個之間插入2.這通常需要索引重寫樹以適應,並且這'重新平衡'行動需要一些時間。 重新平衡所涉及的組件越大(在這種情況下,a = 100的子集),它將花費的時間越多。 請注意,此重新平衡活動只會更頻繁 且更廣泛地發生,但不一定在每個插入上。 這是因為樹通常會在葉子內留出一些空間用於擴展。 當葉子用完房間時,它知道是時候重新平衡了。

在您的情況下,由於您的索引主要基於當前日期,因此您將在單日范圍內不斷重新平衡樹。 每天都會開始一個新的范圍,因此在這一天的范圍內開始重新平衡。 最初這只涉及一些重新平衡,但隨着當天現有條目的范圍增加,這將會增加。 當你開始新的一天時,這個循環就會重新開始,這就是你所看到的結果。

這發生在主鍵上可能會使事情變得更糟,因為不是移動一些索引指針,而是可能需要移動整行數據以適應新條目。 (最后一點假設MyISAM集群是在主鍵上執行的,這一點到目前為止我還沒有得到澄清,盡管有點證據似乎支持這一點。例如,請看這里這里 。)

暫無
暫無

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

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