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

Kek*_*koa 4 django django-models

在Django模型中有一个很好的方法来指定特定的索引存储类型吗?

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

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

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

Ara*_*yan 7

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

解决此限制的最佳方法是在创建表之后修改索引,如您所建议的那样.您可以使用Django的特定后端的初始SQL数据功能.只需在您的应用程序中创建一个"sql"目录,并创建一个<your_modelname>.mysql.sql在其中调用的SQL文件.然后将SQL用于修改索引类型,Django将在影响模型表的"syncdb"或"reset"调用之后执行它.


小智 6

当前接受的答案需要更新。另外,这看起来像是这个的重复: 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',)),)

Run Code Online (Sandbox Code Playgroud)