我运行一个网站,我需要在其中存储这样的信息:
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?
甚至是另一个数据库系统?
该表变得非常大(数千万行(,并且经常被大量查询。
MySQL不会使用复合索引,除非它使用索引中的前"n"个字段:
MySQL可以将多列索引用于测试索引中所有列的查询,或者仅测试第一列,前两列,前三列等的查询。如果在索引定义中以正确的顺序指定列,则单个复合索引可以加快对同一表的多种查询速度。
至少为每个重要字段创建一个单独的索引,尤其是date
列。
正如Alnitak指出的那样,问题是如何定义索引。如果要快速访问这些日志,则一个索引可能还不够。
优化通常仅通过索引来完成(至少在您的情况下(。要回答您的其他问题:
- 将流量属性强制转换为浮点数不会带来性能,它应该不会产生影响。
-
MyISAM
很快!InnoDB
会更慢,因为它具有所有数据库事务开销。但是:这取决于你想要什么。MyISAM
可能非常危险,因为它总是会中断(断电等(。速度将是使用它的主要原因,但我认为在您的情况下,这不会产生如此大的差异(但是索引确实如此(。始终使用InnoDB
,除非您的数据不重要(对于日志,您可以忽略这一点(。 - 其他DBMS的行为基本上类似于
InnoDB
。我目前正在使用PostgreSQL
,它非常成熟,但绝对没有MyISAM
那么快。
因此,请尝试定义良好的索引。此处的查询需要 user_id, date
上的索引。注意:顺序很重要!