Python 为什么django order__by在众多查询中如此缓慢?
我有很多领域。像这样:Python 为什么django order__by在众多查询中如此缓慢?,python,mysql,django,django-models,django-orm,Python,Mysql,Django,Django Models,Django Orm,我有很多领域。像这样: class Tag(models.Model): books = models.ManyToManyField ('book.Book', related_name='vtags', through=TagBook) class Book (models.Model): nump = models.IntegerField (default=0, db_index=True) 我有大约450000本书,对于一些标签,它涉及大约6
class Tag(models.Model):
books = models.ManyToManyField ('book.Book', related_name='vtags', through=TagBook)
class Book (models.Model):
nump = models.IntegerField (default=0, db_index=True)
我有大约450000本书,对于一些标签,它涉及大约60000本书。当我进行如下查询时:
tag.books.order_by('nump')[1:11]
它变得非常慢,大约3-4分钟。
但如果我删除order_by,它将正常运行查询
order_by version的原始sql如下所示:
'SELECT `book_book`.`id`, ... `book_book`.`price`, `book_book`.`nump`,
FROM `book_book` INNER JOIN `book_tagbook` ON (`book_book`.`id` =
`book_tagbook`.`book_id`) WHERE `book_tagbook`.`tag_id` = 1 ORDER BY
`book_book`.`nump` ASC LIMIT 11 OFFSET 1'
你对此有什么想法吗?我怎样才能修好它?谢谢
---编辑---
按照@bouke的建议,检查mysql中的上一个原始查询:
SELECT `book_book`.`id`, `book_book`.`title`, ... `book_book`.`nump`,
`book_book`.`raw_data` FROM `book_book` INNER JOIN `book_tagbook` ON
(`book_book`.`id` = `book_tagbook`.`book_id`) WHERE `book_tagbook`.`tag_id` = 1
ORDER BY `book_book`.`nump` ASC LIMIT 11 OFFSET 1;
11 rows in set (4 min 2.79 sec)
然后使用解释找出原因:
+----+-------------+--------------+--------+---------------------------------------------+-----------------------+---------+-----------------------------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------+--------+---------------------------------------------+-----------------------+---------+-----------------------------+--------+---------------------------------+
| 1 | SIMPLE | book_tagbook | ref | book_tagbook_3747b463,book_tagbook_752eb95b | book_tagbook_3747b463 | 4 | const | 116394 | Using temporary; Using filesort |
| 1 | SIMPLE | book_book | eq_ref | PRIMARY | PRIMARY | 4 | legend.book_tagbook.book_id | 1 | |
+----+-------------+--------------+--------+---------------------------------------------+-----------------------+---------+-----------------------------+--------+---------------------------------+
2 rows in set (0.10 sec)
对于桌上书(u book):
mysql> explain book_book;
+----------------+----------------+------+-----+-----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+----------------+------+-----+-----------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(200) | YES | | NULL | |
| href | varchar(200) | NO | UNI | NULL | |
..... skip some part.............
| nump | int(11) | NO | MUL | 0 | |
| raw_data | varchar(10000) | YES | | NULL | |
+----------------+----------------+------+-----+-----------+----------------+
24 rows in set (0.00 sec)
尝试在您试图在
order\u by
clauseAlready中使用的字段上建立索引。没有帮助。但是当使用Book.objects.order_by('-popular')时,db_索引确实有帮助@aamiradnathere是您发布的代码(按流行排序)与原始SQL代码片段(按nump排序)之间的差异。您需要在用于排序的字段上有一个DB索引,如@AamirAdnan commented@bouke我手动将nump字段修改为popular,以便于阅读。但是忘记修改原始sql部分(现已修复)。它仍然不起作用。你认为这可能是mysql或django的问题吗?mysql:Ver 14.14 Distrib 5.5.31,对于使用readline 6.2Did的debian linux gnu(i686),您尝试直接在mysql上运行SQL,如果这也很慢,那么您就不需要考虑Django了。尝试执行解释[您的查询]
以了解有关您的查询的更多信息,并确定查询速度慢的原因。