使用 EF4 和 MySql

Posted

技术标签:

【中文标题】使用 EF4 和 MySql【英文标题】:Working with EF4 and MySql 【发布时间】:2011-04-06 12:18:14 【问题描述】:

需要一些关于 EF4 和 mysql 的建议。

我有一张包含大量数据项的表格。每个项目都属于一个模块和一个区域。数据项也有一个时间戳(记号)。最常见的用法是应用程序在指定时间后查询模块和区域的数据。应该对数据进行排序。

问题是查询选择了很多行,并且数据库服务器内存不足,导致查询非常慢。我尝试将查询限制为 100 个项目,但生成的 sql 只会在所有项目都被选择和排序后应用限制。

dataRepository.GetData().WithModuleId(ModuleId).InZone(ZoneId).After(ztime).OrderBy(p

=> p.Timestamp).Take(100).ToList();

由 MySql .Net 连接器 6.3.6 生成的 SQL

 SELECT  
`Project1`.`Id`,  
`Project1`.`Data`,  
`Project1`.`Timestamp`,  
`Project1`.`ModuleId`,  
`Project1`.`ZoneId`,  
`Project1`.`Version`,  
`Project1`.`Type`  
FROM (SELECT  
`Extent1`.`Id`,  
`Extent1`.`Data`,  
`Extent1`.`Timestamp`,  
`Extent1`.`ModuleId`,  
`Extent1`.`ZoneId`,  
`Extent1`.`Version`,  
`Extent1`.`Type`  
FROM `DataItems` AS `Extent1`  
 WHERE ((`Extent1`.`ModuleId` = 1) AND (`Extent1`.`ZoneId` = 1)) AND  
(`Extent1`.`Timestamp` > 634376753657189002)) AS `Project1`  
 ORDER BY  
`Timestamp` ASC LIMIT 100  

表定义

CREATE TABLE  `mydb`.`DataItems` (

  `Id` bigint(20) NOT NULL AUTO_INCREMENT,  
  `Data` mediumblob NOT NULL,  
  `Timestamp` bigint(20) NOT NULL,  
  `ModuleId` bigint(20) NOT NULL,  
  `ZoneId` bigint(20) NOT NULL,  
  `Version` int(11) NOT NULL,  
  `Type` varchar(1000) NOT NULL,  
  PRIMARY KEY (`Id`),  
  KEY `IX_FK_ModuleDataItem` (`ModuleId`),  
  KEY `IX_FK_ZoneDataItem` (`ZoneId`),  
  KEY `Index_4` (`Timestamp`),  
  KEY `Index_5` (`ModuleId`,`ZoneId`),  
  CONSTRAINT `FK_ModuleDataItem` FOREIGN KEY (`ModuleId`) REFERENCES  
`Modules` (`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION,  
  CONSTRAINT `FK_ZoneDataItem` FOREIGN KEY (`ZoneId`) REFERENCES `Zones`  
(`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION  
) ENGINE=InnoDB AUTO_INCREMENT=22904 DEFAULT CHARSET=utf8;  

欢迎所有有关如何解决此问题的建议。

【问题讨论】:

【参考方案1】:

您的 GetData() 方法在做什么?我敢打赌它正在对整个表执行查询。这就是为什么你的 Take(100) 最后什么也没做。

【讨论】:

GetData返回一个IQueryable,问题中描述了实际生成的SQL查询。【参考方案2】:

我通过使用此处描述的表拆分方法解决了这个问题: Table splitting in entity framework

【讨论】:

以上是关于使用 EF4 和 MySql的主要内容,如果未能解决你的问题,请参考以下文章

.NET EF4.1 + MySQL 的类继承

如何使用 MVC3 多对多关系和 EF4.1 模型优先检索数据?

EF4 连接问题

使用 EF4.1 Fluent API 将具有导航属性的实体拆分为两个表

EF4 POCO:快照与 WCF 上的自我跟踪

部署问题:Oracle + EF4 + Win Server 2008