Django:为索引列指定HASH而不是BTREE

时间:2010-07-19 23:35:19

标签: django django-models

Django模型中是否有一种指定特定索引存储类型的好方法?

例如,MySQL的默认存储类型是BTREE,对于我的特定列,将HASH(哈希表)作为存储类型可能更有效。

如果没有创建自定义字段或修改django核心,我找不到一个好方法,这将为我做到这一点。我也可以通过在创建表之后修改索引来实现这一目的。

对于大多数情况,这种情况可能无关紧要,但是有些情况下哈希表是一种更有效的查找机制,当然,对列进行排序要么没有必要,要么没有意义。例如,具有随机生成数据的列通常不会对信息进行合理排序(除非您正在寻找可重复的随机排序 - 但这不是重点)。

2 个答案:

答案 0 :(得分:7)

在查看django.db.backends.mysql.creation.sql_indexes_for_field()的代码之后,似乎无法在Django本身中指定索引类型(除非您没有办法在查询中获取USING参数想要后端的子类。)

解决此限制的最佳方法是在创建表后修改索引,如您所建议的那样。您可以使用Django的backend-specific initial SQL data功能。只需在应用程序中创建一个“sql”目录,并在其中创建一个名为<your_modelname>.mysql.sql的SQL文件。然后将SQL用于修改索引类型,Django将在影响模型表的“syncdb”或“reset”调用之后执行它。

答案 1 :(得分:2)

当前接受的答案需要更新。 另外,这看起来像是此副本的副本: Python Django: how to select the index type?

不确定我能做什么,所以我将答案复制粘贴到另一个线程:

自提出问题以来,事情发生了很大变化。现在可以通过模型的元类在模型层中定义索引(至少从django 1.11开始): https://docs.djangoproject.com/en/dev/ref/contrib/postgres/indexes/

例如:

from django.contrib.postgres.indexes import HashIndex
from django.db import models


class User(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        indexes = (HashIndex(fields=('name',)),)