【问题标题】:How does this change affect the speed of this database query?此更改如何影响此数据库查询的速度?
【发布时间】:2011-03-18 15:14:08
【问题描述】:

首先我使用了这个请求:

Model.object.get(name='something', date=somedatavariable)

但后来我需要扩展我的查询并将其更改为:

Model.objects.get(name__icontains="something", date__range(start_date,end_date))

突然间,我的数据库花费的时间是原始查询的 5 倍。这是怎么回事,我怎样才能让它更快?

【问题讨论】:

    标签: mysql database django optimization


    【解决方案1】:

    不区分大小写的通配符搜索 (name__icontains='something') 肯定会比区分大小写的精确匹配 (name='something') 更昂贵的数据库查询。慢 5 倍听起来并非不合理,但它会根据以下任何和所有因素而有很大差异:

    • 数据库引擎(MySQL、PostgreSQL、SQLite 等)
    • 数据库中的记录数
    • 必须搜索的每个名称字段中的文本量
    • 数据库是否有适当的索引可用于该列

    最后一个非常棘手。为数据库做全文索引很难正确,也很容易出错,甚至不是所有数据库引擎都支持。

    datedate__range 也是如此:您在一个中使用快速、简单、易于索引的精确匹配,而在另一个中使用不精确匹配。

    底线:如果您不需要不精确匹配,请不要使用它们。它们是昂贵的数据库操作,并且需要更长的时间。

    【讨论】:

    • 也许我可以重新配置 MySQL 数据库。我不喜欢它的工作方式。我觉得挺长的。但在任务管理器中显示 MySQL 仅使用 25 mb。我可以为 MsSQL 扩展内存吗?
    • 不是内存问题。 MySQL 的内存管理很好。您需要更多地了解数据库索引和排序规则的工作方式。或者快速“我不想理解,给我一个解决方案......”然后我推荐这个谷歌搜索:google.com/search?q=django+mysql+full-text+indexing
    【解决方案2】:

    我怀疑是否有人能猜到,您的数据库的行为究竟如何 :-) 但您可以使用这个中间件:

    http://djangosnippets.org/snippets/161/

    并检查进行了哪些类型的 sql 查询以及它们花费了多少时间。

    【讨论】:

    • 确切地知道查询花费了多长时间是一件好事,但老实说,我更喜欢在可以隔离变量的单元测试中进行这种分析。不过,查询看起来相当简单,而且 OP 减速的根源也很清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多