2012-05-20 58 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,因为日期字段使用'大于'运算符。 –