Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Django order_by(';-id';)与多个筛选器组合时速度非常慢_Mysql_Django - Fatal编程技术网

Mysql Django order_by(';-id';)与多个筛选器组合时速度非常慢

Mysql Django order_by(';-id';)与多个筛选器组合时速度非常慢,mysql,django,Mysql,Django,我有一个模型行,带有一个组外键。 我想在单个组中获取特定id下的最后30行。为此,我使用以下查询: Line.objects.filter(group\u id=8460,id\u lt=10333449)。order\u by(“-id”)[:30] 我的问题是,这个查询需要1.5秒才能执行,而这三个查询几乎是立即完成的(在通常一起查询的字段上添加索引是加快这些查询速度的好方法。在您的情况下,在组和id上添加索引似乎是合适的 class Line(TransactionSubject):

我有一个模型,带有一个外键。 我想在单个组中获取特定id下的最后30行。为此,我使用以下查询:

Line.objects.filter(group\u id=8460,id\u lt=10333449)。order\u by(“-id”)[:30]


我的问题是,这个查询需要1.5秒才能执行,而这三个查询几乎是立即完成的(在通常一起查询的字段上添加索引是加快这些查询速度的好方法。在您的情况下,在
组和
id上添加索引似乎是合适的

class Line(TransactionSubject):

    # fields...

    class Meta:
        indexes = [
            models.Index(fields=['group', 'id'], name='group_id_index'),
        ]

我设法以它为基础解决了它

创建索引是第一步,但问题是Django没有首先使用该索引

我通过使用扩展强制使用
use\u index

Line.objects.filter(group_id=8460, id__lt=10333449).use_index('group_id_index').order_by("-id")[:30]

查询从1.4s变为40ms:)

您能分享您的型号吗?索引可以是solution@IainShelvington我假设索引可以工作,但我不确定如何实现它。你需要从模型中看到什么?为了避免问题过于复杂,我没有分享它,因为它上还有大约22个其他字段。在
group\u id
id
上建立索引可能会加快查询速度,因为它们是查询的字段,然后按其排序。模型和这两个字段定义可能有助于为如何定义index@IainShelvington我分享了这个模型,但我真的认为它只是让它变得更加混乱。Group是一个外键,所以django默认为它编制索引,不是吗?“id”也是如此。不幸的是,添加了这个索引后,查询仍然需要1.4秒。您确实运行了makemigrations和migrate吗?调试的下一步是查看queryes、did makemigrations和migrate上的
EXPLAIN
的输出。甚至给它时间索引所有东西。我在我的帖子中添加了
explain
的打印内容。你能给索引一个名称(添加到答案中)并再次显示
explain
的输出吗?很难知道输出中的哪个索引与添加的索引匹配。我唯一能想到的是,有另一个字段被过滤。您也可以添加完整的SQL查询吗?
(1.339) SELECT `playerdata_line`.`id`, `playerdata_line`.`wood`, `playerdata_line`.`copper`, `playerdata_line`.`silver`, `playerdata_line`.`gold`, `playerdata_line`.`platinum`, `playerdata_line`.`legendary`, `playerdata_line`.`total_value`, `playerdata_line`.`group_id`, `playerdata_line`.`user_id`, `playerdata_line`.`author_id`, `playerdata_line`.`tone`, `playerdata_line`.`content`, `playerdata_line`.`action`, `playerdata_line`.`is_storytelling`, `playerdata_line`.`is_chat`, `playerdata_line`.`is_description`, `playerdata_line`.`is_comment`, `playerdata_line`.`character_state_id`, `playerdata_line`.`created`, `playerdata_line`.`edited`, `playerdata_line`.`party_id`, `playerdata_line`.`language_id` FROM `playerdata_line` WHERE (`playerdata_line`.`group_id` = 8460 AND `playerdata_line`.`id` < 10333449) ORDER BY `playerdata_line`.`id` DESC  LIMIT 30; args=(8460, 10333449)
class Line(TransactionSubject):

    # fields...

    class Meta:
        indexes = [
            models.Index(fields=['group', 'id'], name='group_id_index'),
        ]
Line.objects.filter(group_id=8460, id__lt=10333449).use_index('group_id_index').order_by("-id")[:30]