【mysql】
mysql是目前最主流的跨平台、开放源代码的关系型数据库,由瑞曲的mysql ab公司开发,已经被SUN公司收购,标识是一只名为sakila的海豚,代表mysql的速度、能力、精确优秀品质,mysql速度快、体积小、成本低、开放源代码。
mysql优点:
1 功能强大:提供多种数据库存储引擎,可以处理每天数亿次访问。支付事务、视图、存储过程、触发器
2 跨平台:基本上支持所有平台。包括linux window freeBSD IBMAIX等,可以在任何平台下编写而不用做任何修改而进行迁移
3 速度快:使用快速的B速磁盘表(MyISAM)和索引压缩,通过优化的单扫描多链接,实现快速链接。mysql函数使用高度优化类库实现,速度极快
4 安全性高:灵活和安全的权限和密码系统,连接到服务器时所有密码传输均采用加密方式,从而保证密码安全
5 mysql完全免费,用户直接从网上下载使用
6 支持各种开发语言:mysql为主流的程序提供支持,为他们提供API函数,包括PHP,asp.NET,JAVA,Python,perl,ruby等
7 支持大容量储存:储存大小由操作系统对文件大小的限制决定,mysql内部不做限制
【数据库命名规则】
1不能与其他库重名
2名称以字母、数字、下划线、符号构成,不能使用单独数字
3长度不可以超过64个字符
4不能使用mysql关键字
5windows中数据库名,表名不区分大小写,linux下区分,所以建意使用小写的数据库或表名
【数据库的三范式】
第一范式:内容相似的数据列必须消除(“清除”的办法是再创建一个数据表来存放);
必须为每一组相关数据分别创建一个数据表;
每条数据记录必须用一个主键来标识;
第二范式:只要数据列里的内容出现重复,就意味着应该把数据表拆分为多个子表;
拆分出来的数据表必须用外键关联起来;.
第三范式:与主键没有直接关系的数据列必须消除(“消除”的办法是再创建一个数据表来存放)
第一范式:若关系模式R的每一个属性是不可再分解的,再属于第一范式。
第二范式:若R属于第一范式,且所有的非码属性都完全函数依赖于码属性,则为第二范式。
第三范式:若R属于第二范式,且所有的非码属性没有一个是传递函数依赖于候选码,则属于第三范式
一个好的数据库设计方案应该满足以下几项要求:
数据表里没有重复冗余的数据;
数据表里没有 order1, order2, order3等重复的数据列;
数据表的空间占用总量越小越好;
使用频率高的查询都能以简单高效的方式执行。
【主键与外键】
数据表之间抽象的关联/引用关系是依靠具体的主键和外键建立起来的。
主键:主键的作用是帮助MySQL以最快的速度把一条特定的数据记录在数据表里的位置确定下来。主键必须是唯一的,任意两条数据记录里的主键字段绝不允许是同样的内容;主键都必须有索引(即“主索引”);
外键:外键的作用是引用另一个数据表的某条记录;
【索引】
为了在一个数据表里检索某个特定的记录,或者提取一系列数据记录,MySQL必须把这个数据表里的所有数据记录都搜索一遍。如果数据表的体积比较庞大,在遇到这样一些查询的时候性能就会显著的下降。为解决性能下降的问题可以为查询所涉及的数据列创建并使用一个索引。
注意:索引可以加快数据的检索操作,但会使数据修改操作变慢。每修改一条数据记录,索引就必须刷新一次。
索引另一个明显缺陷是它们会在硬盘上占用相当大的空间。因此,应该只为最经常查询和最经常排序的数据列建立索引。
1.普通索引: 普通索引的唯一任务就是加快对数据的访问速度。因此应该只为那些最经常出现在查询条件(WHERE column=…)或排序条件(ORDER BY column)中的数据列创建索引。
2.唯一索引: 在许多时候,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。也就是说唯一索引可以保证数据的唯一性。
3.主索引:主索引是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主索引;
【SQL命令可以分类以下三大类别】
DML(Data Manipulation Language 数据处理语言):这类命令主要包括 SELECT、INSERT、UPDATE、DELETE等用来从数据表读出数据,把数据存入数据表或是对数据表里的现有记录进行修改的命令;
DDL(Data Definition Language 数据定义语言):这类命令主要包括CREATE TABLE、ALTER TABLE 等用来定义和改变数据库结构的命令;
DCL(Data Control Language 数据控制语言):这类命令主要包括GRANT、REVOKE以及另外几个用来帮助人们设置和调整MySQL访问控制机制的SQL命令;
【数据库中的事务是什么】?
事务就是一系列的操作,这些操作完成一项任务。只要这些操作里有一个操作没有成功,事务就操作失败,发生回滚事件。即撤消前面的操作,这样可以保证数据的一致性。而且可以把操作暂时放在缓存里,等所有操作都成功有提交数据库,这样保证费时的操作都是有效操作。
【三种类型的数据库】
1、阶层型数据库:以树状形式定义数据结构,通过树型结构对数据进行操作,父记录拥有多个子记录,子记录只有一个父记录。阶层型数据库思想简单,但会造成大量数据冗余。
2、网络型数据库:与阶层数据库类似,不同点是每个子记录可以有多个父记录,解决了阶层数据库的问题,但是操作数据时也会很麻烦。
3、关系数据库:是建立在关系模型基础上的数据库。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。标准数据查询语言SQL就是一种基于关系数据库的语言,对关系数据库中数据的检索和操作。
【data中的三种文件类型】
*.frm是描述了表的结构,
*.MYD保存了表的数据记录,
*.MYI则是表的索引
【悲观锁和乐观锁】
业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,我们希望针对某个时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化。此时,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的 “ 锁 ” ,即给我们选定的目标数据上锁,使其无法被其他程序修改。
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 通常是使用for update子句来实现悲观锁机制。
观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。 如一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户帐户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对几百上千个并发,这样的情况将导致怎样的后果。
乐观锁:相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。