索引在数据库中有很重要的地位,它可以极大的提高数据的查询速度,但是过多的索引也会降低插入、删除、更新表的速度。因为在执行这些写操作时,还要操作索引文件。
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="选中状态" )
例如单独创建person字段的索引
name = models.CharField( blank=True,null=True,max_length=50, verbose_name="姓名", db_index=True )
当然,除了这一种方式外,还有以下两种,分别是:
unique_together 联合主键,包含 index_together
index_together 组合索引
例如在购物车表中,登录的用户和商品两个字段在一起表示唯一记录。
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% * 10% * 10% 直接得到一万条数据
建立联合索引的同时,还会给他们之间的组合建立索引。