distinct的后面若是是多个列,要求因此列都重复的,能够过滤html
oracle与mysql的区别node
Mysql通常使用自动增加类型,在建立表时只要指定表的主键为auto increment,插入记录时,不须要再指定该记录的主键值,Mysql将自动增加;Oracle没有自动增加类型,主
键通常使用的序列,插入记录时将序列号的下一个值付给该字段便可;只是ORM框架是只要是native主键生成策略便可。mysql
MYSQL里能够用双引号包起字符串,ORACLE里只能够用单引号包起字符串。在插入和修改字符串前必须作单引号的替换:把全部出现的一个单引号替换成两个单引号。sql
MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不允许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。所以导数据时要对空字符
进行判断,若是为NULL或空字符,须要把它改为一个空格的字符串。数据库
3. 翻页的SQL语句的处理
MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;PHP里还能够用SEEK定位到结果集的位置。ORACLE处理翻页的SQL语句就比较繁琐了。每一个结果集只有一个ROWNUM字段标明它的位置, 而且只能用ROWNUM<100, 不能用ROWNUM>80。
如下是通过分析后较好的两种ORACLE翻页SQL语句( ID是惟一关键字的字段名 ):服务器
1、基本概念架构
2、Mysql基本介绍并发
三范式定义(范式和反范式)oracle
9. 如何通俗地理解三个范式? 框架
答:第一范式:1NF是对属性的原子性约束,要求属性具备原子性,不可再分解;
第二范式:2NF是对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其余字段派生出来,它要求字段没有冗余。。
范式化设计优缺点:
优势:
能够尽可能得减小数据冗余,使得更新快,体积小
缺点:对于查询须要多个表进行关联,减小写得效率增长读得效率,更难进行索引优化
反范式化:
优势:能够减小表得关联,能够更好得进行索引优化
缺点:数据冗余以及数据异常,数据得修改须要更多的成本
char和varchar:
1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。因此char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n) 固定长度,char(4)无论是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),
因此varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。
varchar和text:
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字
节。
2.text类型不能有默认值。
3.varchar可直接建立索引,text建立索引要指定前多少个字符。varchar查询速度快于text
5.二进制数据(_Blob)
1._BLOB和_text存储方式不一样,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
2._BLOB存储的数据只能总体读出。
3._TEXT能够指定字符集,_BLO不用指定字符集。
InnoDB 是 MySQL 默认的事务型存储引擎,只有在须要 InnoDB 不支持的特性时,才考虑使用其它存储引擎。
采用 MVCC 来支持高并发,而且实现了四个标准的隔离级别,默认级别是可重复读。
表是基于聚簇索引创建的,它对主键的查询性能有很高的提高。
内部作了不少优化,包括从磁盘读取数据时采用的可预测性读、可以自动在内存中建立哈希索引以加速读操做的自适应哈希索引、可以加速插入操做的插入缓冲区等。
经过一些机制和工具支持真正的热备份。
事务
InnoDB 是事务型的。
备份
InnoDB 支持在线热备份。
崩溃恢复
MyISAM 崩溃后发生损坏的几率比 InnoDB 高不少,并且恢复的速度也更慢。
并发
MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。
其它特性
MyISAM 支持全文索引,地理空间索引。
原子性(Atomicity)一个事务必须被视为一个不可分割的最小工做单元,整个事务中的全部操做要么所有提交成功,要么所有失败回滚,对于一个事务来讲,不可能只执行其中的一部分操做。
一致性(Consistency)数据库老是从一个一致性的状态转换到另外一个一致性的状态。
隔离性(Isolation)一个事务所作的修改在最终提交之前,对其余事务是不可见的。
持久性(Durability)一旦事务提交,则其所作的修改不会永久保存到数据库。
4 种隔离级别
READ UNCOMMITTED(未提交读)脏读:事务中的修改,即便没有提交,对其余事务也都是可见的。
READ COMMITTED(提交读)不可重复读:事务从开始直到提交以前,所作的任何修改对其余事务都是不可见的。
REPEATABLE READ(可重复读):幻读:一个事务按相同的查询条件读取之前检索过的数据,其余事务插入了知足其查询条件的新数据。产生幻行。
SERIALIZABLE(可串行化) 强制事务串行执行
MVVC是个行级锁的变种,它在普通读状况下避免了加锁操做,自特定状况下加锁。
死锁是指两个或两个以上的进程在执行过程当中,因争夺资源而形成的一种互相等待的现象,若无外力做用,它们都将没法推动下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程.
1.尽可能避免并发的执行涉及到修改数据的语句。
2.要求每个事务一次就将全部要使用到的数据所有加锁,不然就不容许执行。
3.预先规定一个加锁顺序,全部的事务都必须按照这个顺序对数据执行封锁。如不一样的过程在事务内部对对象的更新执行顺序应尽可能保证一致。
4.每一个事务的执行时间不可太长,对程序段的事务可考虑将其分割为几个事务。在事务中不要求输入,应该在事务以前获得输入,而后快速执行事务。
5.使用尽量低的隔离级别。
6.数据存储空间离散法。该方法是指采用各类手段,将逻辑上在一个表中的数据分散的若干离散的空间上去,以便改善对表的访问性能。主要经过将大表按行或者列分解为若干小表,或者按照不一样的用户群两种方法实现。
7.编写应用程序,让进程持有锁的时间尽量短,这样其它进程就没必要花太长的时间等待锁被释放。
(1)终止(或撤销)进程。终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态中解除出来。
(2)抢占资源。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以打破死锁状态。
一、查看错误日志
由于死锁被检测到后会回滚,这些信息都会以异常反应在应用的业务日志中,经过这些日志咱们能够定位到相应的代码,并把事务的sql给梳理出来。
一、查询是否锁表 show OPEN TABLES where In_use > 0;
二、查询进程 show processlist 查询到相对应的进程===而后 kill id
三、查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
四、查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
B-Tree 索引是大多数 MySQL 存储引擎的默认索引类型。
由于再也不须要进行全表扫描,只须要对树进行搜索便可,所以查找速度快不少。
能够指定多个列做为索引列,多个索引列共同组成键。B-Tree 索引适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。
除了用于查找,还能够用于排序和分组。
若是不是按照索引列的顺序进行查找,则没法使用索引。
基于哈希表实现,优势是查找很是快。
在 MySQL 中只有 Memory 引擎显式支持哈希索引。
InnoDB 引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的很是频繁时,会在 B-Tree 索引之上再建立一个哈希索引,这样就让 B-Tree 索引具备哈希索引的一些优势,好比快速的哈希查找。
限制:哈希索引只包含哈希值和行指针,而不存储字段值,因此不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,因此大部分状况下这一点对性能影响并不明显;没法用于分组与排序;只支持精确查找,没法用于部分查找和范围查找;若是哈希冲突不少,查找速度会变得很慢。
大大减小了服务器须要扫描的数据量;
帮助服务器避免进行排序和建立临时表;
将随机 I/O 变为顺序 I/O。
定时器
热备份
错误日志:记录了当 mysqld 启动和中止时,以及服务器在 运行过程当中发生任何严重错误时的相关信息。
二进制文件:记录了全部的 DDL(数据定义语言)语句和 DML(数据操纵语言) 语句,不包括数据查询语句。语句以“事件”的形式保存,它描述了数据的更改过程。(按期删除日志,默认关闭)。
查询日志:记录了客户端的全部语句,格式为纯文本格式,能够直接进行读取。(log 日志中记录了全部数据库的操做,对于访问频繁的系统,此日志对系统性能的影响较大,建议关闭,默认关闭)。
慢查询日志:慢查询日志记录了包含全部执行时间超过参数long_query_time(单位:秒)所设置值的 SQL 语句的日志。(纯文本格式)MySQL日志文件之错误日志和慢查询日志详解。
日志文件小结:
系统故障时,建议首先查看错误日志,以帮助用户迅速定位故障缘由。
记录数据的变动、数据的备份、数据的复制等操做时,打开二进制日志。默认不记录此日志,建议经过--log-bin 选项将此日志打开。
若是但愿记录数据库发生的任何操做,包括 SELECT,则须要用--log 将查询日志打开, 此日志默认关闭,通常状况下建议不要打开此日志,以避免影响系统总体性能。
查看系统的性能问题, 但愿找到有性能问题的SQL语 句,须要 用 --log-slow-queries 打开慢查询日志。对于大量的慢查询日志,建议使用 mysqldumpslow 工具 来进行汇总查看。
drop,delete与truncate的区别
(1)DELETE语句执行删除的过程是每次从表中删除一行,而且同时将该行的删除操做做为事务记录在日志中保存以便进行进行回滚操做。
TRUNCATE TABLE 则一次性地从表中删除全部的数据并不把单独的删除操做记录记入日志保存,删除行是不能恢复的。而且在删除的过程当中不会激活与表有关的删除触发器。执行速度快。
数据库的优化
MySQL能够很好的支持大数据量的存取,可是通常说来,数据库中的表越小,在它上面执行的查询也就会越快。所以,在建立表的时候,为了得到更好的性能,咱们能够将表中字段的宽度设得尽量小。
例如,在定义邮政编码这个字段时,若是将其设置为CHAR(255),显然给数据库增长了没必要要的空间,甚至使用VARCHAR这种类型也是多余的,由于CHAR(6)就能够很好的完成任务了。一样的,若是能够的话,咱们应该使用MEDIUMINT而不是BIGIN来定义整型字段。
另一个提升效率的方法是在可能的状况下,应该尽可能把字段设置为NOTNULL,这样在未来执行查询的时候,数据库不用去比较NULL值。
对于某些文本字段,例如“省份”或者“性别”,咱们能够将它们定义为ENUM类型。由于在MySQL中,ENUM类型被看成数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,咱们又能够提升数据库的性能。
链接(JOIN)..之因此更有效率一些,是由于MySQL不须要在内存中建立临时表来完成这个逻辑上的须要两个步骤的查询工做。
尽管咱们可使用子查询(Sub-Queries)、链接(JOIN)和联合(UNION)来建立各类各样的查询,但不是全部的数据库操做均可以只用一条或少数几条SQL语句就能够完成的。更多的时候是须要用到一系列的语句来完成某种工做。可是在这种状况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的操做就会变得不肯定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的状况:第一个表中成功更新后,数据库忽然出现意外情况,形成第二个表中的操做没有完成,这样,就会形成数据的不完整,甚至会破坏数据库中的数据。要避免这种状况,就应该使用事务,它的做用是:要么语句块中每条语句都操做成功,要么都失败。换句话说,就是能够保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操做失败,那么,ROLLBACK命令就能够把数据库恢复到BEGIN开始以前的状态。
锁定表的方法能够维护数据的完整性,可是它却不能保证数据的关联性。这个时候咱们就可使用外键。
例如,外键能够保证每一条销售记录都指向某一个存在的客户。在这里,外键能够把customerinfo表中的CustomerID映射到salesinfo表中CustomerID,任何一条没有合法CustomerID的记录都不会被更新或插入到salesinfo中。
建索引