2012-05-20 56 views
0

我運行一個網站,我需要存儲的信息是這樣的:這個mysql/myisam表可以優化嗎?

table: logs 
* date (date) 
* server_1 (unsigned int) 
* server_2 (unsigned int) 
* user_id (unsigned int) 
* ip (unsigned int) 
* service (enum) 
* traffic (unsigned bigint) 

我的查詢看起來primarliy這樣的:

SELECT SUM(traffic) FROM logs WHERE user_id = 8381 AND date > DATE_ADD(CURDATE(), INTERVAL -7 DAY) AND service != 'unknown' 

我有過,除了交通的所有領域和複合主鍵user_id和服務上的索引

是否將maby更有效地將流量存儲爲float?

也是MyIsam一個很好的引擎,或者我應該使用innodb?

甚至還有另一個數據庫系統?

該表格變得非常大(數千萬行)並且被嚴重查詢。

+0

「EXPLAIN ...」說什麼? – Alnitak

+0

查詢有一個'hoster'列。你的表格的定義沒有。 –

+0

oh sorry hoster = service,編輯它 –

回答

1

的MySQL won't use a composite index,除非它使用索引的第一個「N」字段:

MySQL能使用多列索引來測試索引中的所有列的查詢或查詢該測試只是第列,前兩列,前三列等等。如果您在索引定義中以正確順序指定列,則單個組合索引可以加速同一個表上的多種查詢。

至少爲每個重要字段創建單獨的索引,尤其是date列。

+0

對於這個特定的查詢,'(user_id,date)' –

+0

@ypercube或其他方式的索引,取決於哪個字段具有較高的基數... – Alnitak

+0

不,在日期有一個範圍條件,所以它贏了反過來工作。 –

0

正如Alnitak指出的那樣,問題在於您的索引是如何定義的。如果你想在這些日誌上快速訪問,一個索引可能是不夠的。

優化通常只能通過索引來完成(至少在你的情況下)。回答您的其他問題:

  • 將交通屬性轉換爲浮動不會帶來性能,它不應該有所作爲。
  • MyISAM快! InnoDB會比較慢,因爲它有所有的數據庫事務開銷。但是:這取決於你想要什麼。 MyISAM可能會非常危險,因爲它可以永遠打破(Poweroffs等)。速度將是使用它的主要原因,但我認爲在你的情況下,這不會造成如此大的差異(無論索引如何)。總是使用InnoDB,除非你的數據不重要(對於日誌你可以忽略這個)。
  • 其他DBMS的行爲基本如InnoDB。我目前使用PostgreSQL,這是非常成熟的,但絕對沒有MyISAM快。

因此,嘗試定義好的索引。這裏的查詢需要user_id, date的索引。 注意:順序很重要!

+0

索引順序取決於是否有更多的日期或更多的用戶ID。此外,同一日期的記錄更可能在數據庫中相鄰。 – Alnitak

+0

@Alnitak:是的,但在這種情況下,它最有可能是user_id,因爲日期字段使用'大於'運算符。 –