Django自定义Model索引顺序与联合索引设置指南
本文详解Django中如何控制Model创建的数据库索引顺序,特别是涉及ForeignKey时的处理技巧。同时介绍联合约束unique_together与联合索引index_together的配置方法,通过具体案例说明联合索引在大数据量查询中的性能优势及SQL执行逻辑。
Django Model索引顺序控制技巧
这涉及一个先有鸡还是先有蛋的问题。通常情况下,数据来源于Excel整理,随着数据量增加和分析维度增多,仅靠Excel管理变得吃力。
此时需将Excel数据导入数据库。然而,Django Model创建的索引顺序并非完全由编写顺序决定,特别是存在models.ForeignKey时,必须先创建被引用的ForeignKey类,最后再创建总表。
为确保数据库索引顺序与Excel中的索引保持一致,需要对Model中的索引字段进行特殊处理(这可能是一种非标准做法)。
首先需创建ForeignKey对应的类,该类定义必须写在前面,否则总表类在引用ForeignKey时会提示未定义(此处省略具体示例)。
接下来创建总表,此时不要急于填写总表中的索引字段,先仅创建总表的表头结构,参考如下代码示例:
@python_2_unicode_compatible
class ZZ_Demo(models.Model): #此处的ZZ开头的命名是为了让这个class在最后创建
######中间什么都不要写######
class Meta:
verbose_name = '这是个Demo'
verbose_name_plural = '这是个Demo' #这些是在Django admin里显示的 可忽略
def __str__(self):
return self.name
随后在终端执行数据库迁移命令:
python manage.py makemigrations
python manage.py migrate
执行过程中,系统将自动创建数据表。
建表完成后,再添加总表中的索引字段。值得注意的是,Model默认按字母顺序创建索引。若没有其他models.ForeignKey干扰,可直接通过字段名的字母顺序来控制索引的创建顺序,具体配置如下所示:
@python_2_unicode_compatible
class ZZ_Demo(models.Model):
ab_productline = models.ForeignKey(ProductLine, verbose_name=u'产品线',default=1,null=True)
ac_name = models.CharField(max_length=50, verbose_name = u'故障名称',null=True)
......
bn_casetags = models.CharField(max_length=50, verbose_name = u'关键词 标签 备注',default=None,blank=True,null=True)
class Meta:
verbose_name = '这是个Demo'
verbose_name_plural = '这是个Demo'
def __str__(self):
return self.be_casenumber
按此方式创建的索引将完全遵循字母顺序排列,读者可自行验证。
Django联合约束与联合索引配置
Django Model中设置联合约束和联合索引
在Django Model中,可对单表的多个字段进行联合约束和联合索引设置。例如在购物车表中,登录用户ID与商品ID组合表示一条唯一记录。
具体示例如下:
Django Model中定义的购物车表结构。
class Cart(models.Model):
user = models.ForeignKey(
MyUser,
verbose_name="用户"
)
goods = models.ForeignKey(
Goods,
verbose_name="商品"
)
num = models.IntegerField(
verbose_name="商品数量"
)
is_select = models.BooleanField(
default=True,
verbose_name="选中状态"
)
class Meta:
# 联合约束 其中goods和user不能重复
unique_together = ["goods", "user"]
# 联合索引
index_together = ["user", "goods"]
unique_together = ["goods", "user"] 表示联合约束,确保"goods"和"user"的组合值不重复。
index_together = ["user", "goods"] 表示联合索引,使得"goods"和"user"字段在同步查询时能提高效率。
联合索引的优势分析
相关示例SQL语句:select * from person where a=100 and b=100 and c=1000;
假设数据量达到一千万条,每次条件过滤可排除10%的数据。
1. 若使用三个单索引:先利用a字段的索引查找,剩余100万数据;再使用b条件筛选,剩十万;最后用c条件查找,得到一万条结果。
2. 若使用联合索引:一千万条数据经过三次10%的过滤(1000万 * 10% * 10% * 10%),直接得到一万条数据,效率更高。
建立联合索引的同时,数据库还会为字段间的组合建立索引。
以上内容为本文核心要点,希望对读者学习有所帮助,欢迎支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









