我正在使用MySQL的实体框架和我的Linq查询:
db.Persons.Where(x => x.Surname.StartsWith("Zyw")).ToList();
..正在生成SQL:
SELECT PersonId, Forename, Surname
FROM Person
WHERE (LOCATE('Zyw', Surname)) = 1
...而且似乎没有在Surname上使用索引。
如果LOCATE替换为等效的LIKE,则查询会快速返回所需的结果。因为它需要整个下午。
为什么Entity Framework及其连接驱动程序选择了这个奇怪的LOCATE函数/如何让它使用LIKE代替/为什么MySQL为LOCATE函数做出糟糕的索引决定/我该如何让它变得更好?
我担心我为这篇文章简化了我的代码,Linq产生错误实际上是:
var target = "Zyw";
db.Persons.Where(x => x.Surname.StartsWith(target)).ToList();
如果目标术语是硬编码的,则生成的SQL确实使用LIKE,但是使用变量术语,SQL将更改为使用LOCATE。
这些都是使用MySQL Installer 5.6.15提供的最新的通用MySQL for Windows。
与赏金相关的更多笔记;我正在使用:
实体框架代码是生成数据库的第一种样式。
我也尝试过使用Nuget的最新连接器(MySql.Data 6.8.3),问题仍然存在。
答案 0 :(得分:1)
答案 1 :(得分:1)
这看起来像MySQL bug #64935对我的回归。
我可以确认,使用相同版本的EF6和MySQL Connector,我也得到了相同的SQL:
context.stoppoints.Where(sp => sp.derivedName.StartsWith(stopName));
...记录为:
SELECT
`Extent1`.`primaryCode`,
...
`Extent1`.`stop_timezone`
FROM `stoppoints` AS `Extent1`
WHERE (LOCATE(@p__linq__0, `Extent1`.`derivedName`)) = 1
实体框架:6.0.2 MySQL Connector.Net:6.8.3
我有reported this作为MySQL错误回归。