场景
我正在使用Django 2和MySQL开发搜索系统。搜索系统使用参数命中数据库并编译 4表连接查询。对于大量数据,这会使搜索的执行速度变慢。
查询:
itemViewCategory = Item.objects.raw("select *, company.slug as companySlug, company.name as companyName, field.id as fieldId, field.name as fieldName, category.name as categoryName from company inner join category on company.business_type = category.id inner join category_field on category_field.category_id = category.id inner join custom_field as field on category_field.field_id = field.id where category.id = (select id from category where slug= %s) and field.name LIKE %s order by company.name", [slug,product])
此外,我需要计算其他操作所需的数据计数。
我可以通过 2种不同的方式
现在我的问题是哪个过程将更快?我做了一些研究,但没有得到满意的答复,我现在很困惑。有人可以帮我这个查询吗?
答案 0 :(得分:1)
如果您只需要对查询结果进行计数,而又不需要结果集,则数据库将能够更好地优化计数。在这种情况下,如果您使用python进行计数,则数据库将不得不序列化结果集,而python将不得不反序列化结果集,这是很多不必要的流量和计算周期。
但是,如果您实际上还需要结果集,那么执行两个查询(一个来获取结果,一个要计数)很可能会比仅执行一个查询并对python进行计数要慢,尤其是在查询速度慢/复杂且数据库无法进行索引计数的情况下,因为数据库实际上可能必须对数据运行两次。此外,根据您的事务隔离级别,如果您处于允许幻像读取的事务隔离级别,则执行两个查询实际上可能会在两个查询中为您提供不同的计数,因为两个查询之间可能已添加/删除了行。
不过,如果您对此有所担心,那么最终应该对您的操作进行基准测试。