0

我运行一个网站,我需要在其中存储如下信息:

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

我的查询看起来像这样:

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

我在所有字段上都有一个复合主键,除了流量和 user_id 和服务的索引

将流量存储为浮点数可能更有效吗?

MyIsam 也是一个很好的引擎还是我应该使用 innodb?

甚至是另一个数据库系统?

该表变得非常大(数千万行)并且被大量查询。

4

2 回答 2

1

MySQL不会使用复合索引,除非它使用索引中的前“n”个字段:

MySQL 可以将多列索引用于测试索引中所有列的查询,或者只测试第一列、前两列、前三列等的查询。如果您在索引定义中以正确的顺序指定列,则单个复合索引可以加快对同一张表的多种查询。

至少为每个重要字段创建一个单独的索引,尤其是date列。

于 2012-05-20T11:51:08.247 回答
0

正如 Alnitak 指出的那样,问题是如何定义索引。如果您想快速访问这些日志,一个索引可能还不够。

优化通常仅通过索引完成(至少在您的情况下)。要回答您的其他问题:

  • 将流量属性转换为浮点数不会带来性能,它不应该有所作为。
  • MyISAM很快!InnoDB会更慢,因为它有所有的数据库事务开销。但是:这取决于你想要什么。MyISAM可能真的很危险,因为它总是会中断(断电等)。速度将是使用它的主要原因,但我认为在您的情况下不会产生如此大的差异(但是索引确实如此)。始终使用InnoDB,除非您的数据不重要(对于日志,您可以忽略它)。
  • 其他 DBMS 的行为基本类似于InnoDB. 我目前正在使用PostgreSQL,非常成熟,但绝对不如MyISAM.

所以,试着定义好的索引。这里的查询需要在user_id, date. 注意:顺序很重要!

于 2012-05-20T12:13:29.267 回答