我正在使用 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
过滤器输出不同的查询?还是我的索引完全没用?