MYSQL:我应该在用作日志的大型表上创建索引吗?

时间:2010-11-18 11:43:56

标签: mysql indexing

我有一个基本的分析mysql数据库表,它跟踪用户访问时访问的所有ipaddresses和url以及他们访问的时间。 有大量插入(每天数百万)。

几天后,在桌面上运行查询以尝试查找特定日期访问的用户数量需要很长时间。

我应该在表格中添加索引吗?它会在每次插入后重新创建索引吗,值得吗?

或者有更好的方法可以加快我的分析查询速度吗?

这可能是一种常见情况(每个人都有日志)。维护此表的最佳方法是什么?

5 个答案:

答案 0 :(得分:3)

稍后将查询的任何表都应使用索引。查看INSERT DELAYED,它快速返回并专为记录而设计: -

http://dev.mysql.com/doc/refman/5.1/en/insert-delayed.html

这可能是日志表的最佳选择,虽然您也可以查看存档存储引擎,但这更关注空间而不是查找: -

http://dev.mysql.com/doc/refman/5.1/en/archive-storage-engine.html

答案 1 :(得分:1)

它不会重新创建它,但会更新索引。是的,这需要一些时间,但不仅仅是简单的表更新。

无论如何,如果要从带有WHERE的表中进行选择,除了创建索引之外别无选择,否则这些选择将会非常缓慢。

答案 2 :(得分:1)

MYSQL 5.0介绍Archive Storage Engine
我相信回答你的大部分问题

我应该在表格中添加索引 - 是的,如果你想进行搜索

每次插入后都会重新创建索引 - 由mysql内部处理

值得的 - 取决于,添加索引会减慢数据库写操作的速度(取决于索引和记录长度的多少)

或者有更好的方法可以加快我的分析查询 - 如果您只想执行简单的计算,可以考虑每天拆分数据(每个表以保存每天的日志记录)。或者您可以准备某种查询缓存预热脚本

答案 3 :(得分:1)

如果可能,最好更新总计,而不是插入10000000条记录。例如,您每天可以拥有一条记录,其中包含当天的用户数量。这将使得读取比聚合更高效。即使你想要一年的统计数据,你只需要汇总超过365条记录而不是3亿条。

如果您必须单独保留它们,您可以尝试仅将最近的存储作为记录,将较旧的存储作为累积记录,不时地清理数据库。如果您确实需要大量统计数据,则应该查看专门为此目的而设计的其他类型的数据库(数据仓库)。

答案 4 :(得分:1)

另一个答案中INSERT DELAYED的

+1。

在午夜之后,您可以将总nr的访问者存储在另一个表格中,例如

insert into visitor_cache
  select date, count(1)
  from log
  where date < today
  group by date
;

之后您可以从日志表中删除记录。

这样,您只需使用日志表即可获得当天的总计。