我创建了asp mvc项目,它从大型Mysql数据库中获取数据~500000。
我使用单独的列过滤器向我的前端添加了数据表,其中只显示了10个条目。
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
答案 0 :(得分:0)
这一切都归结为数据库的工作方式以及最终生成的SQL类型。 StartsWith被转换为通配符搜索,这可能比简单查询慢。您可以尝试输入索引来帮助您尝试优化的特定查询,并且可以查看生成的SQL以检查它是否与您期望的一样好(有时它可以生成奇怪的SQL,但这看起来像一个简单的查询,所以我不会太担心这一点)。如果添加括号以分隔OR表达式的各个部分,您可能还想检查生成的SQL中是否存在任何差异,例如name == null || (x.name != null && (x.name.StartsWith(name)))