【发布时间】:2011-10-13 06:47:07
【问题描述】:
我正在使用 django,我所有的查询都是由 django 创建的,所以我没有手写查询...
我有一个 BillRecords 的表,其中有一个字段 subscriberno 。在我的 django 过滤器中,我使用如下过滤查询:
BillRecords.objects.filter(subscriberno__icontains='123456')
由于客户说的subscriberno可能是实数的相当缩短的版本...
该过滤器输出如下查询:
SELECT "subscriberno" FROM "BillRecords" WHERE UPPER("subscriberno"::text) LIKE UPPER(E'%123456%');
subscriberno 是一个字符字段,因为一些数字包含字母和一些特殊字符。
在我的数据库中,我的同事为该列创建了两个索引。
"BillRecords_subscriberno" btree (subscriberno)
"BillRecords_fsubscriberno_like" btree (subscriberno varchar_pattern_ops)
我想知道对这样的查询使用两个索引是合乎逻辑的。由于我们所有的 django 过滤器都使用 icontains 并且应该像我上面写的那样创建查询。
Postgres 对查询的分析如下:
Seq Scan on BillRecords (cost=0.00..159782.40 rows=370 width=15) (actual time=579.637..3705.079 rows=10 loops=1)
Filter: (upper((subscriberno)::text) ~~ '%123456%'::text)
Total runtime: 3705.106 ms
(3 rows)
所以,据我所知,没有使用索引。由于索引 usega 在数据插入和更新方面有成本,所以有两个没有使用的索引(据我从这个分析中可以看出)似乎不合逻辑。
django 是否有机会为类似的icontanis 过滤器输出不同的查询?还是我的索引完全没用?
【问题讨论】:
标签: django postgresql indexing django-queryset full-text-indexing