我首先使用带有代码的 EF 5 和带有 6.5.6 mySQL DotNet 连接器的 mySQL 5.5.25(但它不是连接器,因为 DevArt 连接器表现出相同的性能)并且具有如下实体:
public class SocialMediaEventEntity
{
public virtual int Id { get; set; } //PK
public virtual DateTime Date{ get; set; }
public virtual string ProvIdType{ get; set; }
public virtual string ProviderId{ get; set; }
public virtual int Rendered{ get; set; }
public virtual int Sent{ get; set; }
public virtual decimal UserId { get; set; }
public virtual string UserName { get; set; }
public virtual string UserScreenName { get; set; }
public virtual string UserDescription { get; set; }
public virtual ICollection<HistoryEntity> Messages { get; set; }
}
它使用以下代码优先配置密钥等。
HasKey(entity => entity.Id);
Property(entity => entity.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
最终,我通过以下方式向该表添加了一行:
var socialEvent = new SocialMediaEventEntity()
{
Date = ADate,
ProviderId = AProviderId,
ProvIdType = AProviderIdType,
Rendered = ARendered,
Sent = ASent,
UserId = AUserId,
UserName = AUserName ?? string.Empty,
UserScreenName = AUserScreenName ?? string.Empty,
UserDescription = AUserDescription ?? string.Empty,
Messages = new List<HistoryEntity>()
};
MyDBContext.SocialMediaEvents.Add(socialEvent);
在皮肤下,这会生成预期的 SQL:
INSERT INTO tblSocialMediaEvents(`Date`, ProvIdType, ProviderId, Rendered, Sent, UserId, UserName, UserScreenName, UserDescription) VALUES ('2013-03-25 14:26:30', 'Twitter', '316028289447763968', 0, 0, 280310495, 'ChuBbyBhu', 'Komang Trinda Dewi', 'Always smile,,,but no crazy..:D\r All must be beautiful in its time'
现在,在我的机器上分析时的 INSERT 语句非常快,大约 1 毫秒,但是调用:
MyDBContext.SaveChanges();
需要从 ~20 到 ~40ms 的任何时间,偶尔 > 100ms。
当我分析代码时,我发现它实际上是大部分时间的事务提交。但是,当我在事务中执行完全相同的 SQL 到 mySQL 时,情况并非如此。
所以我的问题是:
- 如何提高此代码的性能?除了不那么频繁地调用 SaveChanges() 之外?
- 为什么事务提交比在像 HeidiSQL 这样的 mySQL 客户端工具中执行相同代码时花费的时间要长得多?
感谢任何帮助和指示。
编辑:我对 SQL Server 2008 Express 使用了完全相同的代码,性能非常出色。通常 INSERTS < ~1ms 和 SaveChanges ~1ms。我自然希望 M$ 产品很快,但我被 mySQL 卡住了,无法改变。那么有什么我可以做的吗?