[英]MySql MyISAM INSERT slowness
在mysql表中插入一些數據時出現性能問題。 該表有一堆列,比如DATE,A,B,C,D,E,F,其中DATE,A,B,C,D,E是主鍵。 每天,我在該表中插入70k行(具有不同的日期),此表現在包含1800萬行。 我用來插入行的方法只是發送70k INSERT查詢。
我遇到的問題是查詢開始比以前花費更多的時間。 從幾分鍾到幾個小時。 我描述了插頁,這是我得到的圖表:
每個插入的速度(以秒為單位)與當天插入的數量:
一些奇怪的事實:
知道是什么原因引起的嗎?
**編輯**索引中的列按以下順序排列:
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.