2010-10-08 53 views
4

我發現自己陷入了一種困境。我已經使用了頁面表擊中近1.05億行跟蹤它看起來像這樣。(!):MySQL:擁有100多萬行的索引表

CREATE TABLE `media_hits` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `media_code` char(7) NOT NULL, 
    `day` date NOT NULL, 
    `hits` int(10) unsigned NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `media_code` (`media_code`,`day`) 
) ENGINE=InnoDB; 

,你可以想像運行任何在該表上的查詢需要很長的時間。典型的查詢如下:

SELECT DISTINCT(`media_code`), COUNT(*) AS c 
FROM `media_hits` 
WHERE `day` >= DATE_SUB(NOW(), INTERVAL 1 DAY) 
GROUP BY(`media_code`) 
ORDER BY c DESC 
LIMIT 200; 

該查詢需要永久。並在查詢說明給我這個:

  id: 1 
    select_type: SIMPLE 
     table: media_hits 
     type: index 
possible_keys: NULL 
      key: media_code 
     key_len: 10 
      ref: NULL 
     rows: 104773158 
     Extra: Using where; Using index; Using temporary; Using filesort 

這只是非常可怕的。所以我的問題是:我能做些什麼呢?試圖添加適當的索引是不可能的。 ALTER TABLE查詢可能需要一個星期才能運行。我嘗試刪除6個月以上的行,但24小時後,該查詢仍在運行。

我需要解決這個問題。我唯一想到的就是創建一個具有適當索引的新表,並開始在該表中記錄點擊。在後臺,我可以有一個腳本緩慢地從舊的media_hits表中插入記錄。任何人都可以提供關於如何索引此表的建議,並且可能提供有關應該索引哪些列的提示?

回答

2

對於這種工作,索引本身很可能無法幫助您。更好地考慮某種緩存策略,並使用一些額外的表來存儲您需要的聚合。

例如,對於上面的查詢,您可以添加包含3列「media_code」,「counter」和「date」的第二個表「media_code_per_day」。每次你插入一行到你的原始表,也相應地更新「media_code_per_day」。然後,您可以在「media_code_per_day」上運行新查詢,而不是原始查詢。

當然,要在您的情況下初始化您的新表,您將不得不使一次批處理運行所有現有行,但只需要一次。

+0

我同意需要一個新的系統,並且聚合表將非常有幫助。我想真正的問題是以不需要幾周的方式導入舊數據。哈哈如果這是需要的,那麼這就是需要的,但如果有一個更簡單的方法,它會很好。 – mellowsoon 2010-10-08 17:53:49

2

對於該特定查詢,((day,media_code)上的索引將幫助最大。它仍然需要使用一個臨時表,因爲group by,並且執行filesort,因爲您正在按count(*)進行排序,但是該索引將減少必須大幅掃描的行數。

如果你需要更好的性能,那麼你可能必須像@DocBrown所說的那樣做一些聚集表。但是我會先嚐試索引,看看它是否足夠有用,然後再去完成額外表格的所有工作。

此外,如果您想慢慢清除舊行而無需運行需要幾天的大型刪除,則可以爲刪除查詢添加限制。您可以批量刪除它們(如每次10K或100K行),以緩慢減小該表的大小,直到足夠小以添加索引爲止。

0

你也可以看看vertica社區版。

SELECT count(*) FROM event_track; 
    count  
------------ 
1595756573 
(1 row) 

在最近沒有提交查詢的系統中,在6秒內回來。是的,這個數字接近16億行,而且在非常合理的響應時間(通常是幾秒鐘,更少的幾分鐘)內,我一直都會像上面提到的那樣查詢。

好的一點是,當你將你的實時數據從mysql轉儲到一個巨大的csv文件後,它很容易用一個COPY FROM命令將其導入到vertica中。

https://dba.stackexchange.com/a/35614/20451有關於在哪裏下載vertica的詳細信息。