2010-11-02 173 views
2

我正在使用python/django作为编程语言/框架。我需要知道的是完全关于postgresql和索引...postgresql索引使用 - 加号和减号

对于那些使用django可能知道内容类型和Django管理日志。但很快,管理员日志正在记录用户操作。我也用它来记录网站内执行的所有操作。所以它有1.000.000+的记录。我使用SQL查询来筛选结果,多数民众赞成在这里...

问题是,我使用两个字段从不同的表中选择数据。其中之一是内容类型,它存储相关的数据库表信息和字段索引...

其他字段是,对象id,它存储相关对象的id,字段类型是varchar和字段是未编入索引...

使用的Examle是:

Select from django_admin_log where content_type_id=15 and object_id="12343545"; 

由于content_type_id = 15分我blog_texts表和相关对象的ID是12343545,我可以很容易地取得相关资料...

但是object_id没有索引,而table有1 .000.000+记录,像我上面写的查询需要大量的执行时间。

在object_id中使用索引有哪些好处和缺点。这些好处是否会比弊端大?

更新:我没有更新管理日志表。它只记录所有用户操作... 40.000-45.000记录每天插入到表中。系统在一天中的2/3,大约15-16小时(早上到傍晚)期间真的很忙。因此,在上午8点到下午11点期间插入45.000条记录...

因此,从这个角度来看,如果我创建索引,是否会导致数据库过度过载?

更新2:还有一个问题。另一张带有布尔型字段的2.000.000+记录表。字段类似于“将其显示”,并且与其他过滤标准一起使用。为这样的布尔型字段创建索引是合乎逻辑的。

二conditin是,与1.000.000记录的表索引的布尔和日期时间字段一起...

使用索引,这两个条件是一个好主意或没有?

回答

1

只是为了澄清....

对于这个特殊的SQL,你应该使用一个指数包括两列(content_type_idobject_id) - 级联指数。

在这种情况下,您只能删除content_type_id上的现有索引 - 新索引将能够服务器仅查询content_type_id的查询以及查询两列均被过滤的查询。

两个索引 - 现有的索引和仅限于object_id的新索引 - 可能不会为此查询提供最佳结果。

编辑:如果您扩展现有索引object_id列,插入的性能损失将可以忽略不计,但您的选择将工作得更快。

编辑2:如果你有这样的

WHERE bool = true 

等一个这样的语句:

WHERE bool = true AND date > something 

我建议在BOOL的级联指数第一,然后日期。

与不等式比较一起使用的列应移向索引的末尾。

但是,根据您的数据,可能不会索引BOOL字段。例如如果95%的所有行都为真,上述语句不会过滤得太多。在这种情况下,索引可能会降低select语句的性能。但是,一个好的优化器会忽略索引。仍然会有插入/更新/删除成本。


了解更多关于concatenated indexes in my free eBook

+0

感谢您的回复,quesstion更新... – FallenAngel 2010-11-02 12:44:38

+0

再次更新... – FallenAngel 2010-11-02 14:20:37

1

在object_id中使用索引的好处和缺点是什么?

好处是查询速度会更快。缺点是插入速度会变慢。

效益是否大于弊端?

我敢说是的,他们会这样做,因为谷歌广告收入来自更快的页面加载量的增加肯定会值得您在发布博客条目时必须等待的额外秒数。

更新:

从您的文章我可以断定,该表在高峰时段接收约4条每秒。

4记录1M表中的第二个对于任何体面的服务器都不是问题,所以我相信你可以安全地创建索引。

(object_id, content_type_id)上创建组合索引会更好。

+0

要添加到Quassnoi的答案,你也将在一般情况下更新UPDATES,但看看你的情况,我怀疑object_id会得到更新。看看你的情况,唯一受到INSERTS和UPDATES影响的是你,所以看起来好像是一个安全的选择,让你的用户有足够的速度。 – 2010-11-02 11:41:12

+0

感谢您的回复,quesstion更新... – FallenAngel 2010-11-02 12:43:28

+0

再次更新... – FallenAngel 2010-11-02 13:39:02