这个mysql / myisam表可以优化吗?

时间:2012-05-20 11:45:05

标签: mysql sql optimization myisam database-performance

我运营一个网站,我需要存储这样的信息:

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?

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

表变得非常大(数千万行),并且相当严格地查询。

2 个答案:

答案 0 :(得分:1)

MySQL won't use a composite index除非它使用索引中的第一个“n”字段:

  

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

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

答案 1 :(得分:0)

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

优化通常只能通过索引(至少在你的情况下)来完成。回答你的其他问题:

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

因此,尝试定义好的索引。此处的查询需要user_id, date上的索引。 注意:订单很重要!