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了。尝试执行
解释[您的查询]
以了解有关您的查询的更多信息,并确定查询速度慢的原因。