【发布时间】:2012-03-29 00:20:24
【问题描述】:
在 Django 中我有这个:
models.py
class Book(models.Model):
isbn = models.CharField(max_length=16, db_index=True)
title = models.CharField(max_length=255, db_index=True)
... other fields ...
class Author(models.Model):
first_name = models.CharField(max_length=128, db_index=True)
last_name = models.CharField(max_length=128, db_index=True)
books = models.ManyToManyField(Book, blank=True)
... other fields ...
admin.py
class AuthorAdmin(admin.ModelAdmin):
search_fields = ('first_name', 'last_name', 'books__isbn', 'books__title')
...
我的问题是,当我从 Author admin list 页面使用 2 个或更多短期术语进行搜索时,MySQL 开始花费大量时间(对于 3 个术语查询,至少需要 8 秒)。我有大约 5000 位作者和 2500 本书。这里的short很重要。如果我搜索“a b c”,那么 3 个非常短的术语,我没有足够的耐心等待结果(我至少等了 2 分钟)。相反,如果我搜索“所有蜜蜂线索”,我会在 2 秒内得到结果。所以这个问题看起来真的是相关领域的短期问题。
此搜索产生的 SQL 查询有很多 JOIN、LIKE、AND 和 OR,但没有子查询。
我正在使用 MySQL 5.1,但我尝试使用 5.5 没有更多成功。
我还尝试将innodb_buffer_pool_size 增加到一个非常大的值。没有任何改变。
我现在唯一可以提高性能的想法是非规范化为 isbn 和 title 字段(即直接将它们复制到作者中)但我将不得不添加一堆机制来保持这些字段同步与书中真实的。
关于如何改进此查询的任何建议?
【问题讨论】:
标签: mysql django django-admin