EFCore
中
Pomelo.EntityFrameworkCore.MySql
将
UserName.Contains("zyq")
翻译为
LOCATE('zyq',UserName)>0
,而不是
UserName like "%zyq%"
,因为MySQL
LOCATE()
没有使用索引,会导致全表扫描,所以查询变慢。
EF.Functions.Like(UserName , "%zyq%")
[关于此问题的资料]:https://bugs.mysql.com/bug.php?id=64935
[关于EF.Functions.Like ]:https://blogs.msdn.microsoft.com/dotnet/2017/05/12/announcing-ef-core-2-0-preview-1/
文章目录一、关于`EFCore`中`mysql`使用`Contains`查询慢问题探究[^1]二、解决办法为使用`EF.Functions.Like`[^2]三、参考资料一、关于EFCore中mysql使用Contains查询慢问题探究[^1]EFCore中Pomelo.EntityFrameworkCore.MySql将UserName.Contains("zyq")翻译为LOCATE('z...
这个问题没有遇到过,但是面试当中很可能会被问到,当然也不主要是为了应对面试,学到知识才是王道为什么会慢: 在应用程序中定义的每个上下文,其首次使用时,JUST-INTIME编译器:Entity Framework都会根据数据库中的信息在内存中生成一个映射视图(mapping views),这个操作非常耗时。定义的每一个上下文都会受此困扰
1、Code First第一次启动
EFCore的批量操作性能也在不断完善当中,但还是不够优秀,数据量大的情况下还是要单独处理,这里我们使用EFCore.BulkExtensions(SqlServer)
EFCore.BulkExtensions的批量查询还是不适合开箱即用,需要做一些基础封装,我们可以在Context里增加扩展方法
public async Task<List<T>> WhereInAsync<T>(List<T> data, string column) where
1、避免在循环中进行查询操作:避免在循环中进行查询操作,可以将查询结果缓存到内存中,然后对内存中的数据进行操作,可以提高性能。这种方式适合集合数据量少的数据,否则利大于弊。// 不建议的方式:在循环中进行查询操作
foreach (var item in itemList)
var result = context.Items.FirstOrDefault(i => i....
需求:展示个人用户所有所有的信息,数据分别存在大概5个表里面,有接近6万人,查询排列展示出来
一般有FromSqlRaw 和FromSql,我们选FromSqlRaw来用,而FromSql在Efcore3.0中显示已过时
DbContext.set<ResultList>.FromSqlRaw("select * from ...").ToList() //Re
MySQL的IN查询慢可能是由于多种因素导致的。首先,IN查询语句中如果存在大量的值,就会导致查询时间变慢。这时可以考虑分批次查询或者使用JOIN语句来优化查询。
其次,数据库表的索引设置也会影响IN查询的速度。如果IN查询所涉及的字段没有设置索引,那么查询的速度就会变慢。在这种情况下,需要对相应的字段添加索引以加快查询速度。
另外,IN查询在MySQL中采用线性搜索算法,这种算法是一种比较低效的搜索方式。换句话说,如果IN查询操作所涉及的数据集非常大,那么查询速度就会明显变慢。可以考虑对数据进行分割,然后对分割后的部分数据进行查询。
最后,如果IN查询语句中所涉及的数据表过大,而且内存空间不足,也会导致查询速度变慢。这时可以通过增加内存容量或者升级硬件等方式来解决该问题。
总之,MySQL的IN查询慢可能是由于多种因素导致的,需要针对具体情况进行分析和优化,才能提高查询速度。