我运营一个网站,我需要存储这样的信息:
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和service
上的索引都有一个复合主键以流量形式存储流量是否更有效率?
MyIsam也是一个很好的引擎,还是我应该使用innodb?
甚至是另一个数据库系统?
表变得非常大(数千万行),并且相当严格地查询。
答案 0 :(得分:1)
MySQL won't use a composite index除非它使用索引中的第一个“n”字段:
MySQL可以对测试索引中所有列的查询使用多列索引,或者只测试第一列,前两列,前三列等的查询。如果在索引定义中以正确的顺序指定列,则单个复合索引可以加速同一个表上的多种查询。
至少为每个重要字段创建一个单独的索引,尤其是date
列。
答案 1 :(得分:0)
正如Alnitak指出的那样,问题是你的索引是如何定义的。如果您希望快速访问这些日志,则一个索引可能还不够。
优化通常只能通过索引(至少在你的情况下)来完成。回答你的其他问题:
MyISAM
很快! InnoDB
将会变慢,因为它具有所有数据库事务开销。但是:这取决于你想要什么。 MyISAM
可能非常危险,因为它可能会永远破坏(Poweroffs等)。速度将是使用它的主要原因,但我不认为在你的情况下会产生如此大的差异(但索引确实如此)。始终使用InnoDB
,除非您的数据不重要(对于日志,您可以忽略这一点)。InnoDB
相似。我目前正在使用PostgreSQL
,这是非常成熟的,但绝对不如MyISAM
快。因此,尝试定义好的索引。此处的查询需要user_id, date
上的索引。 注意:订单很重要!