【问题标题】:Django: Specifying HASH instead of BTREE for indexed columnDjango:为索引列指定 HASH 而不是 BTREE
【发布时间】:2011-03-18 04:32:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    查看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”调用后执行。

    【讨论】:

      【解决方案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',)),)
      
      

      【讨论】:

      猜你喜欢
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2017-12-20
      • 2011-06-02
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      相关资源
      最近更新 更多