Работа с EF4 и MySql - PullRequest
       1

Работа с EF4 и MySql

0 голосов
/ 06 апреля 2011

Нужен совет по работе с EF4 и MySql.

У меня есть таблица с множеством элементов данных. Каждый элемент принадлежит модулю и зоне. Элемент данных также имеет метку времени (тики). Чаще всего приложение запрашивает данные через определенное время для модуля и зоны. Данные должны быть отсортированы.

Проблема заключается в том, что запрос выбирает много строк, а на сервере базы данных не хватает памяти, что приводит к очень медленному запросу. Я пытался ограничить запрос до 100 элементов, но созданный sql будет применять ограничение только после того, как все элементы были выбраны и отсортированы.

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

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

Сгенерированный SQL с помощью MySql .Net Connector 6.3.6

 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;  

Все предложения о том, как решить эту проблему, приветствуются.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Я решил это, используя метод разделения таблицы, описанный здесь: Разделение таблиц в рамках сущности

0 голосов
/ 06 апреля 2011

Что делает ваш метод GetData ()?Могу поспорить, что он выполняет запрос ко всей таблице.И именно поэтому ваш Take (100) в конце ничего не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...