MySQL锁、索引、日志知识小结

1. myisam和innodb区别

  • myisam是MySQL 5.1以前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级锁,所以一般用于有大量查询少量插入的场景来使用,而且myisam不支持外键,并且索引和数据是分开存储的。
  • innodb是基于聚簇索引建立的,和myisam相反它支持事务、外键,并且通过MVCC来支持高并发,索引和数据存储在一起。

2. MySQL的索引

  • B+树和Hash索引

  • B+树是左小右大的顺序存储结构,节点只包含id索引列,而叶子节点包含索引列和数据,这种数据和索引在一起存储的索引方式叫做聚簇索引,一张表只能有一个聚簇索引。假设没有定义主键,InnoDB会选择一个唯一的非空索引代替,如果没有的话则会隐式定义一个主键作为聚簇索引

    image-20210929154403899

  • 非聚簇索引(二级索引)保存的是主键id值,这一点和myisam保存的是数据地址是不同的

    image-20210929154445643

  • 区别
    image-20210929154500925

3. 覆盖索引和回表

阅读更多

LinQtoEntity类型转换

使用EntityFrameWork时,经常会用到lambda表达式来做查询等操作,由于EF要根据表达式生成最终操作数据库的SQL,所以在表达式中加入其它方法如”parse”,”convert”可能会导致不被LinqToEntity识别,异常如下:

System.NotSupportedException: LINQ to Entities does not recognize the method int.Parse(System.String)

但在实际项目中往往会遇到实体字段类型与参数类型需要转换并比较的问题:

问题1: 字段int型与参数string型的比较

例:

阅读更多

EntityFramework5.0与WCF使用遇到的问题

在使用EntityFramework5.0,并将其作为WCF放在服务端的时候遇到了如下问题:

1. EF在客户端与服务端之间传输问题

由于将EF放在服务端,所以类必须具有DataContract属性。

服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。

只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember,如下所示。

阅读更多

SQLServer游标指南

【什么是游标】

SQLServer是关系型数据库,在关系型数据库中,我们处理的对象都是面向集合的。假设我们有一个Tabel叫Test,id是主键,如下图左所示,当我们用SELECT TOP 5 [id],[name] FROM [Test] 执行时,会得到右图所示的数据集,这个数据集就是我们关注的对象。

抛开数据库中的游标不说,我们先看看下面这个东西:

阅读更多

EF记录数据变更方法

在使用SQLServer时,通常情况下使用SQLServer自带管理器可以查看到数据变更的记录。如果在程序用需要更灵活的记录这些信息,则可以通过EF的ObjectStateManager属性的相关方法实现。

ObjectStateManager.GetObjectStateEntries 方法

返回具有给定状态的对象或关系的 ObjectStateEntry 对象的集合。

命名空间: System.Data.Objects

程序集: System.Data.Entity(在 System.Data.Entity.dll 中)

阅读更多

EF一对多关系删除问题

在使用EF删除一对多关系的实体时,碰到如下提示:

“其他信息: 操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null。对关系作出更改后,会将相关的外键属性设置为 null 值。如果外键不支持 null 值,则必须定义新的关系,必须向外键属性分配另一个非 null 值,或必须删除无关的对象。”

原因很简单,假设一个A对应多个B,那么B中的外键就是A的主键,如果先删除A,接着又把B读取到datacontext中

var lstB = a.B.ToList();

container.A.DeleteObject(a);

就会导致B中的外键失去关联,所以便产生了错误,解决的办法有下面几种:

阅读更多

EntityFramework学习——EF开发模式

好久没写EF的东西,使用起来也觉得生疏,最近EF5发布,学习了一下新知识,总结一番。

1.Entity Framework架构原理回顾

什么是EF:EntityFrameWork是微软一个开源的ORM(对象关系映射)框架,是微软主推的数据存储技术,常用于构建数据存储层,使应用程序以对象模型的方式访问关系数据库的内容。

EF的架构和原理:EF的核心内容是EDM,具体可参考前一篇内容。可以理解为它是一个ADO.NET的增强版,它的底层是ADO.NET provider,上层则是应用程序,它提供了更灵活,更简单方便的数据存取方式。

EF的优点:它是一个开源框架,支持多种数据库(目前看来最稳定的是SQL Server,而Oracle的支持一直不太完美),将应用程序和数据库结构很好的分隔开,支持多种开发模式。

阅读更多

SQLServer中DateTime数据格式

在oracle中可以直接使用ToChar(getdate(),’yyyy-mm-dd’)

但在SQL Server 中需要以下的参数方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
	
select CONVERT(varchar, getdate(), 120 )

2004-09-12 11:06:08

select CONVERT(varchar(12) , getdate(), 111 )

2004/09/12

select CONVERT(varchar(12) , getdate(), 112 )

20040912

select CONVERT(varchar(12) , getdate(), 102 )

2004.09.12

select CONVERT(varchar(12) , getdate(), 101 )

09/12/2004

select CONVERT(varchar(12) , getdate(), 103 )

12/09/2004

select CONVERT(varchar(12) , getdate(), 104 )

12.09.2004

select CONVERT(varchar(12) , getdate(), 105 )

12-09-2004

select CONVERT(varchar(12) , getdate(), 106 )

12 09 2004

select CONVERT(varchar(12) , getdate(), 107 )

09 12, 2004

select CONVERT(varchar(12) , getdate(), 108 )

11:06:08

select CONVERT(varchar(12) , getdate(), 109 )

09 12 2004 1

select CONVERT(varchar(12) , getdate(), 110 )

09-12-2004

select CONVERT(varchar(12) , getdate(), 113 )

12 09 2004 1

select CONVERT(varchar(12) , getdate(), 114 )

11:06:08.177

EntityFramework学习——模型概述与环境搭建

1.Entity Framework简介

Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架。早期被称为 ObjectSpace。它以新实体框架为特色。使得开发人员可以通过对象模型(而不是逻辑/关系数据模型)专注于数据。实体框架有助于将逻辑数据架构抽象为概念模型,并且允许以多种方式通过对象服务和名为“EntityClient”的新数据提供程序与概念模型交互。EntityFramework的主要特点:

  1. 支持多种数据库(Microsoft SQL Server, Oracle, and DB2);
  2. 强劲的映射引擎,能很好地支持存储过程;
  3. 提供Visual Studio集成工具,进行可视化操作;
  4. 能够与ASP.NET, WPF, WCF, WCF Data Services进行很好的集成。

EF使用概念层(ConceptualModels)、映射层(Mappings)和逻辑层(StorageModels)将逻辑数据库结构抽象化。使开发人员可以编写更少的数据访问代码,减少维护,将数据结构抽象化为更易于开展业务(标准化程度较低)的方式,并且有利于数据的持久性。同时这三层也是EF的核心——EDM(实体数据集)。

阅读更多