我使用python / django作为编程语言/框架。我需要知道的是关于postgresql和索引......
对于那些使用django的人可能知道Content Type和Django Admin Log。但不久,管理员日志正在记录用户操作。我还使用它来记录站点内执行的所有操作。所以它有1.000.000+记录。我使用sql查询来过滤结果,多数民众赞成到这里......
问题是,我使用两个字段从不同的表中选择数据。其中一个是内容类型,它存储相关的数据库表信息,并且该字段被索引...
其他字段是,object id,它存储相关对象的id,字段类型是varchar而field不是索引...
使用考试是:
Select from django_admin_log where content_type_id=15 and object_id="12343545";
由于content_type_id = 15指向我的blog_texts表,相关对象的id为12343545,我可以轻松获取相关数据......
但是object_id没有编入索引,并且表有1.000.000+个记录,像我上面写的查询需要大量的执行时间。
在object_id中使用索引会有什么好处和缺点。这些好处是否会比缺点更重要?
更新:管理员日志表上没有更新。它只记录所有用户操作...每天将40.000-45.000记录插入到表中。并且系统在一天的2/3期间非常繁忙,大约15-16小时(从早到晚)。因此,在上午8点到晚上11点之间插入了45.000条记录...
所以从这个角度来看,如果我创建索引会导致数据库过多吗?
更新2:还有一个问题。另一个带有2.000.000+记录的表,带有一个布尔字段。字段类似于“将显示它”,并与其他过滤条件一起使用。为这样的布尔字段创建索引是否合乎逻辑。
第二个条件是,在一个包含1.000.000条记录的表中将布尔值和日期时间字段索引在一起......
使用索引来表示这两个条件是不是一个好主意?
答案 0 :(得分:1)
在object_id中使用索引会有什么好处和缺点。
好处将是更快的查询。缺点是插入速度较慢。
好处是否大于缺点?
我敢说,是的,他们会这样做,因为从更快的页面加载中获得的Google广告收入增加肯定值得在发布博客条目时等待额外的秒数。
<强>更新强>
从你的帖子我可以得出结论,该表在高峰时间每秒收到大约4条记录。
1M
表上的每秒4条记录对于任何体面的服务器都不是问题,所以我相信你可以安全地创建索引。
最好在(object_id, content_type_id)
上创建综合索引。
答案 1 :(得分:1)
只是为了澄清......
对于这个特定的SQL,您应该使用包含列(content_type_id
和object_id
)的一个索引 - 连接索引。
在这种情况下,您可以删除仅在content_type_id
上的现有索引 - 新索引将能够为仅筛选content_type_id
的服务器查询以及两个列都已过滤的查询
两个索引 - 现有的索引和仅object_id
的新索引 - 可能无法为此查询提供最佳结果。
编辑:如果您将现有索引扩展到object_id
列,则插入的性能损失可以忽略不计,但您的选择将更快。
编辑2 :如果你有这样的陈述
WHERE bool = true
和其他人一样:
WHERE bool = true AND date > something
我建议首先在BOOL上建立一个连接索引然后DATE。
与不等式比较一起使用的列应该移到索引的末尾。
但是,根据您的数据,不要索引BOOL字段可能是有意义的。例如如果所有行的95%都为真,则上述语句不会过滤太多。在这种情况下,索引可能会降低select语句的性能。但是,一个好的优化器只会忽略索引。仍然会有插入/更新/删除成本。