Linq和.Count大数据库

时间:2017-05-07 10:27:16

标签: c# mysql linq

我创建了asp mvc项目,它从大型Mysql数据库中获取数据~500000。

我使用单独的列过滤器向我的前端添加了数据表,其中只显示了10个条目。

enter image description here

data = dc.books.OrderBy(x => x.id).Where(x =>
        (market_id == 0 || x.market_id == market_id)
        && (name == null || x.name != null && (x.name.Contains(name)))
        && (author == null || x.author != null && (x.author.Contains(author)))
    ).Skip(param.Start).Take(10).ToList();

快速而良好地工作。

当我尝试在过滤器之后添加计数以进行打包。不工作服务器Mysql Timeout错误或工作很慢

count = db.books.Count(x =>
                    (market_id == 0 || x.market_id != 0 && x.market_id == market_id)
                    && (name == null || x.name != null && (x.name.StartsWith(name)))

为什么算不算还是慢?

所有代码我的conttoller here

1 个答案:

答案 0 :(得分:0)

这一切都归结为数据库的工作方式以及最终生成的SQL类型。 StartsWith被转换为通配符搜索,这可能比简单查询慢。您可以尝试输入索引来帮助您尝试优化的特定查询,并且可以查看生成的SQL以检查它是否与您期望的一样好(有时它可以生成奇怪的SQL,但这看起来像一个简单的查询,所以我不会太担心这一点)。如果添加括号以分隔OR表达式的各个部分,您可能还想检查生成的SQL中是否存在任何差异,例如name == null || (x.name != null && (x.name.StartsWith(name)))