HappyLifeLife.com
HappyLifeLife.com
HappyLifeLife.com 登录 HappyLifeLife.com 注册 HappyLifeLife.com
爱新闻 爱生活
爱分享 爱学习
爱读书 爱探索
爱音乐 爱宇宙
爱电影 爱地球
爱阅读 爱世界
爱运动 爱科技
爱学习

<< < - > >>
DB
db
www.HappyLiveLife.com 收藏 www.happylivelife.com
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
编辑
SQLite优化方法 1.建表优化SQLite的数据库本质文件读写操作,频繁操作打开和关闭是很耗时和浪费资源的; 优化方法事务机制:这里要注意一点:事务的开启是要锁定DB的,其他对DB的写入操作都是无法成功的。db.beginTransaction(); //手动设置开始事务try {//这里写你数据操作db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交} catch (Exception e) {} finaly {db.endTransaction(); //提交} 项目中不会把项目上万条数据存SQL里的,尽管android有SQLite。那样处理起来非常慢,而且程序经常出现ANR。 打个比方:有200个城市,每个城市500条城市信息,你怎么创建表? A:我创建一张表存10000条数据。B:200张表,每张存500条数据。C:我创建两张表, 一张存city,其实这张表只有1条数据; Id(编号), Version(这200个城市更新版本用) CityDate(200个城市xml格式字符串数据)。 另一张表存城市信息表:200条数据,每个城市一条数据 id(CityDate解析出城市对象对应的id) Version(这500条城市信息更新版本用) CityMessage(500条城市信息xml格式字符串数据)。 首先你给用户展示200城市(你只取了一条数据 200个城市xml格式字符串数据进行解析) 用户点击一个城市你显示500条记录(通过城市解析ID,取出城市信息表中对应500数据xml格式字符串数据进行解析) 这样做的好处:(1)统一数据接口,无论你从网络上直接去数据,还是读本地缓存统一数据接口,xml(2)数据进行排序,内存操作要快一些;(3)其实这和自己写文件没什么区别,为什么还要用数据库那,这么做有利于程序版本更新升级数据 维护! 2.其他技巧 1) 相对于封装过的ContentProvider而言,使用原始SQL语句执行效率高,比如使用方法rawQuery、execSQL的执行效率比较高。 2) 对于需要一次性修改多个数据时,可以考虑使用SQLite的事务方式批量处理,我们定义SQLiteDatabase db对象,执行的顺序为 db.beginTransaction(); //这里处理数据添加,删除或修改的SQL语句 db.setTransactionSuccessful(); //这里设置处理成功 db.endTransaction(); //这句很重要,告诉数据库处理完成了,这时SQLite的底层会执行具体的数据操作。 3) 打好SQL语句的基础,对于查询,以及分配表的结构都十分重要 3. 一、影响查询性能的因素: 1. 对表中行的检索数目,越小越好 2. 排序与否。 3. 是否要对一个索引。 4. 查询语句的形式 二、几个查询优化的转换 1. 对于单个表的单个列而言,如果都有形如T.C=expr这样的子句,并且都是用OR操作符连接起来,形如: x = expr1 OR expr2 = x OR x = expr3 此时由于对于OR,在SQLite中不能利用索引来优化,所以可以将它转换成带有IN操作符的子句:x IN(expr1,expr2,expr3)这样就可以用索引进行优化,效果很明显,但是如果在都没有索引的情况下OR语句执行效率会稍优于IN语句的效率。 2. 如果一个子句的操作符是BETWEEN,在SQLite中同样不能用索引进行优化,所以也要进行相应的等价转换: 如:a BETWEEN b AND c可以转换成:(a BETWEEN b AND c) AND (a>=b) AND (a<=c)。 在上面这个子句中, (a>=b) AND (a<=c)将被设为dynamic且是(a BETWEEN b AND c)的子句,那么如果BETWEEN语句已经编码,那么子句就忽略不计,如果存在可利用的index使得子句已经满足条件,那么父句则被忽略。 3. 如果一个单元的操作符是LIKE,那么将做下面的转换:x LIKE ‘abc%’,转换成:x>=‘abc’ AND x<‘abd’。因为在SQLite中的LIKE是不能用索引进行优化的,所以如果存在索引的话,则转换后和不转换相差很远,因为对LIKE不起作用,但如果不存在索引,那么LIKE在效率方面也还是比不上转换后的效率的。 三、几种查询语句的处理(复合查询) 1.查询语句为: ORDER BY ORDER BY 执行方法: is one of UNION ALL, UNION, EXCEPT, or INTERSECT. 这个语句的执行过程是先将selectA和selectB执行并且排序,再对两个结果扫描处理,对上面四种操作是不同的,将执行过程分成七个子过程: outA: 将selectA的结果的一行放到最终结果集中 outB: 将selectA的结果的一行放到最终结果集中(只有UNION操作和UNION ALL操作,其它操作都不放入最终结果集中) AltB: 当selectA的当前记录小于selectB的当前记录 AeqB: 当selectA的当前记录等于selectB的当前记录 AgtB: 当selectA的当前记录大于selectB的当前记录 EofA: 当selectA的结果遍历完 EofB: 当selectB的结果遍历完 四、子查询扁平化 例子:SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5 对这个SQL语句的执行一般默认的方法就是先执行内查询,把结果放到一个临时表中,再对这个表进行外部查询,这就要对数据处理两次,另外这个临时表没有索引,所以对外部查询就不能进行优化了,如果对上面的SQL进行处理后可以得到如下SQL语句:SELECT x+y AS a FROM t1 WHERE z<100 AND a>5,这个结果显然和上面的一样,但此时只需要对数据进行查询一次就够了,另外如果在表t1上有索引的话就避免了遍历整个表。 运用flatten方法优化SQL的条件: 1.子查询和外查询没有都用集函数 2.子查询没有用集函数或者外查询不是个表的连接 3.子查询不是一个左外连接的右操作数 4.子查询没有用DISTINCT或者外查询不是个表的连接 5.子查询没有用DISTINCT或者外查询没有用集函数 6.子查询没有用集函数或者外查询没有用关键字DISTINCT 7.子查询有一个FROM语句 8.子查询没有用LIMIT或者外查询不是表的连接 9.子查询没有用LIMIT或者外查询没有用集函数 10.子查询没有用集函数或者外查询没用LIMIT 11.子查询和外查询不是同时是ORDER BY子句 12.子查询和外查询没有都用LIMIT 13.子查询没有用OFFSET 14.外查询不是一个复合查询的一部分或者子查询没有同时用关键字ORDER BY和LIMIT 15.外查询没有用集函数子查询不包含ORDER BY 16.复合子查询的扁平化:子查询不是一个复合查询,或者他是一个UNION ALL复合查询,但他是都由若干个非集函数的查询构成,他的父查询不是一个复合查询的子查询,也没有用集函数或者是DISTINCT查询,并且在FROM语句中没有其它的表或者子查询,父查询和子查询可能会包含WHERE语句,这些都会受到上面11、12、13条件的限制。复制代码SELECT a+1 FROM (SELECT x FROM tabUNION ALLSELECT y FROM tabUNION ALLSELECT abs(z2) FROM tab2) WHERE a!=5 ORDER BY 1 转换为:SELECT x+1 FROM tab WHERE x+1!=5UNION ALLSELECT y+1 FROM tab WHERE y+1!=5UNION ALLSELECT abs(z2)+1 FROM tab2 WHERE abs(z2)+1!=5ORDER BY 1复制代码 五、连接查询 在返回查询结果之前,相关表的每行必须都已经连接起来,在SQLite中,这是用嵌套循环实现的,在早期版本中,最左边的是最外层循环,最右边的是最内层循环,连接两个或者更多的表时,如果有索引则放到内层循环中,也就是放到FROM最后面,因为对于前面选中的每行,找后面与之对应的行时,如果有索引则会很快,如果没有则要遍历整个表,这样效率就很低,但在新版本中,这个优化已经实现。 优化的方法如下: 对要查询的每个表,统计这个表上的索引信息,首先将代价赋值为SQLITE_BIG_DBL(一个系统已经定义的常量): 1、如果没有索引,则找有没有在这个表上对rowid的查询条件: 如果有Rowid=EXPR,如果有的话则返回对这个表代价估计,代价计为零,查询得到的记录数为1,并完成对这个表的代价估计。 如果没有Rowid=EXPR 但有rowid IN (...),而IN是一个列表,那么记录返回记录数为IN列表中元素的个数,估计代价为NlogN, 如果IN不是一个列表而是一个子查询结果,那么由于具体这个子查询不能确定,所以只能估计一个值,返回记录数为100,代价为200。 如果对rowid是范围的查询,那么就估计所有符合条件的记录是总记录的三分之一,总记录估计为1000000,并且估计代价也为记录数。 如果这个查询还要求排序,则再另外加上排序的代价NlogN 如果此时得到的代价小于总代价,那么就更新总代价,否则不更新。 2、如果WHERE子句中存在OR操作符,那么要把这些OR连接的所有子句分开再进行分析。 如果有子句是由AND连接符构成,那么再把由AND连接的子句再分别分析。 如果连接的子句的形式是X,那么就再分析这个子句。 接下来就是把整个对OR操作的总代价计算出来。 如果这个查询要求排序,则再在上面总代价上再乘上排序代价NlogN 如果此时得到的代价小于总代价,那么就更新总代价,否则不更新。 3、如果有索引,则统计每个表的索引信息,对于每个索引: 先找到这个索引对应的列号,再找到对应的能用到(操作符必须为=或者是IN(…))这个索引的WHERE子句,如果没有找到,则退出对每个索引的循环,如果找到,则判断这个子句的操作符是什么,如果是=,那么没有附加的代价,如果是IN(sub-select),那么估计它附加代价inMultiplier为25,如果是IN(list),那么附加代价就是N(N为list的列数)。 再计算总的代价和总的查询结果记录数和代价。 nRow = pProbe->aiRowEst inMultiplier;/计算行数/ cost = nRow estLog(inMultiplier);/统计代价/ 如果找不到操作符为=或者是IN(…)的子句,而是范围的查询,那么同样只好估计查询结果记录数为nRow/3,估计代价为cost/3。 同样,如果此查询要求排序的话,再在上面的总代价上加上NlogN 如果此时得到的代价小于总代价,那么就更新总代价,否则不更新。 4、通过上面的优化过程,可以得到对一个表查询的总代价 再对第二个表进行同样的操作,这样如此直到把FROM子句中所有的表都计算出各自的代价,最后取最小的,这将作为嵌套循环的最内层,依次可以得到整个嵌套循环的嵌套顺序,此时正是最优的,达到了优化的目的。 5、所以循环的嵌套顺序不一定是与FROM子句中的顺序一致,因为在执行过程中会用索引优化来重新排列顺序。 六、索引 在SQLite中,有以下几种索引: 1) 单列索引 2) 多列索引 3) 唯一性索引 4) 对于声明为:INTEGER PRIMARY KEY的主键来说,这列会按默认方式排序,所以虽然在数据字典中没有对它生成索引,但它的功能就像个索引。所以如果在这个主键上在单独建立索引的话,这样既浪费空间也没有任何好处。 运用索引的注意事项: 1) 对于一个很小的表来说没必要建立索引 2) 在一个表上如果经常做的是插入更新操作,那么就要节制使用索引 3) 也不要在一个表上建立太多的索引,如果建立太多的话那么在查询的时候SQLite可能不会选择最好的来执行查询,一个解决办法就是建立聚蔟索引。 索引的运用时机: 1) 操作符:=、>、<、IN等 2) 操作符BETWEEN、LIKE、OR不能用索引, 如BETWEEN:SELECT FROM mytable WHERE myfield BETWEEN 10 and 20; 这时就应该将其转换成: SELECT FROM mytable WHERE myfield >= 10 AND myfield <= 20; 此时如果在myfield上有索引的话就可以用了,大大提高速度 再如LIKE:SELECT FROM mytable WHERE myfield LIKE 'sql%'; 此时应该将它转换成: SELECT FROM mytable WHERE myfield >= 'sql' AND myfield < 'sqm'; 此时如果在myfield上有索引的话就可以用了,大大提高速度 再如OR:SELECT FROM mytable WHERE myfield = 'abc' OR myfield = 'xyz'; 此时应该将它转换成: SELECT FROM mytable WHERE myfield IN ('abc', 'xyz'); 此时如果在myfield上有索引的话就可以用了,大大提高速度 3) 有些时候索引都是不能用的,这时就应该遍历全表(程序演示)CentOS(Community ENTerprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。 Ubuntu是一个以桌面应用为主的Linux操作系统。Ubuntu基于Debian发行版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本。Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。 两者同为目前版本中个人和小团队常用的服务级操作系统,在线提供的软件库中可以很方便的安装到很多开源的软件及库。 两者都使用bash作为基础shell,所以在很多基础命令上,ubuntu与centos的差别不是很明显,而ubuntu在桌面界面上要做的更为出色,很多人如果是从兴趣出发而学习linux的首选一般都是ubuntu,毕竟很多人还是很习惯在桌面图形下操作的。Centos与Ubuntu的使用习惯和命令上还是有很多的不同,下面简单列举一下: 1.centos中新建的非root用户是没有sudo的权限的,如果需要使用sudo权限必须在/etc/sudoers 中加入账户和权限,所以切换到root账号的时候只需要输入:su,加入root账号的密码即可。 在Ubuntu中,一般使用sudo+命令,如果是第一次使用会提示输入当前用户的密码(而不是root的密码) 2.在线安装软件中,centos使用的是yum命令,而ubuntu中使用的是apt-get命令。除此之外yum中还有一个从软件源中搜索摸个软件的方法yum search +软件名 3.centos是来自于redhat,所以centos支持rpm格式的安装,而ubuntu显然是不支持的。 4.很多配置文件的位置和默认的文件路径都有很大区别最近公司想要做数据分析,之前我们公司用的是免费的growing IO。他们分析仅限于界面跳转的转化率,不能详细地分析业务数据。我研究了一个需要埋点的产品,搞明白他们是在每个接口的调用埋点,将用户对接口的调用行为记录下来,进行分析。由于接口众多,每个接口的数据都不同。可以充分利用hbase宽表的特性,在一行中定义一个通用的字段来标示当前行的数据类型,操作人,然后定义不同的字段来记录每一种数据。在插入数据的时候,每一行只插入当前类型和当前数据。由于hbase的宽表特性,可以容纳上百万列。可以将一家公司所有的接口访问数据都记录到一张无限大的表中,再配合辅助的用户表,就可以在各种纬度上分析用户的行为了。分析了他们的表结构,我想用mongodb也可以做同样的事情,并且mongo比hbase好的地方在于,他入门门槛相对较低,然后在索引方面,检索的速度远比hbase那种查询要快多了。hbase只能要么按照主键范围查询,要么全表检索。为什么大的互联网公司都在推行hbase呢,这个是困扰我的地方。问了一个前腾讯员工,搞明白了两者的区别。原因就在于写入的速度,hbase由于只维护一个主键,写入的速度要比mongodb这种要维护所有索引的数据库快多了。hbase占用两台机器能完成的事情,mongodb要占用更多的机器,每台机器按一年20000的费用,几百台下来就是一笔很大的费用。但是代价就是hbase记录下东西以后,只能事后通过全表检索或按照索引范围的方式进行整体分析,而不能对具体每个人的数据进行实时分析,更强调数据分析能力而不是实时数据查询能力,因此各有千秋吧。像用户行为分析的这种,一开始产品经理可能会具体看某一个人的数据,但是新鲜过后,只会看程序的分析结果了。因此从经济的角度出发,对于用户行为分析这种不需要实时数据的需求来说,hbase+mysql就可以用最经济的方式解决了。mongodb比较适合需要实时返回数据的大数据应用。关系型数据库的使用已经有相当长的时间了。它们变得流行起来托了管理系统的福,关系模型被实现得相当的好,并且被证明是操作数据的好方法(特别是事务性强的应用)。在这篇DigitalOcean文章中,我们将尝试理解一些最常用、最流行的关系型数据库管理系统(RDBMS)的内核区别。我们将会探索最底层的区别——特性与功能,它们如何工作,在哪方面更出色,以帮助程序员选择合适的RDBMS。目录:一、数据库管理系统1、关系型数据库管理系统2、关系与数据类型3、重要的和流行的关系型数据库二、SQLite1、SQLite支持的数据类型2、SQLite的优势3、SQLite的劣势4、何时使用SQLite5、何时不用SQLite三、MySQL1、MySQL支持的数据类型2、MySQL的优势3、MySQL的劣势4、何时使用MySQL5、何时不用MySQL四、PostgreSQL1、PostgreSQL支持的数据类型2、PostgreSQL的优势3、PostgreSQL的劣势4、何时使用PostgreSQL5、何时不用PostgreSQL 一、数据库管理系统数据库是有组织地存储模型数据的空间,存储各种类型的信息(数据)。每个数据库,除了无模式型的,都有一个模型,提供数据的结构描述。数据库管理系统是管理数据库结构、大小和排序的应用(或库)。1、关系型数据库管理系统关系型数据库系统实现了关系模型,并用它来处理数据。关系模型在表中将信息与字段关联起来(也就是schemas),从而存储数据。这种数据库管理系统需要结构(例如表)在存储数据之前被定义出来。有了表,每一列(字段)都存储一个不同类型(数据类型)的信息。数据库中的每个记录,都有自己唯一的key,作为属于某一表的一行,行中的每一个信息都对应了表中的一列——所有的关系一起,构成了关系模型。2、关系和数据类型关系可以被看做是包含一系列共同表示被保持数据库以及相关信息的属性的数学集合. 这种类型的识别和采集方法可以让关系型数据库以它们自己的方式运作.在定义一个可以向其中插入数据的表时,每一个形成一条记录的元素(例如: 属性)都必须同定义的数据类型相匹配(例如:一个integer, 一个date 等等.). 不同的关系型数据库管理系统实现了不同的数据类型 -- 它们不总是能直接互相转换的.与限制的协作,就像我们之前已经介绍过的,在关系数据库的使用中是很普遍的。事实上,限制形成了关系的核心.3、重要和流行的关系型数据库本文中,我们将会介绍三种主要而且重要的开源关系型数据库管理系统,是他们影响了应用开发世界。SQLite 一个强大的嵌入式关系型数据库管理系统MySQL 最流行的RDBMSPostgreSQL 最先进SQL型开源objective-RDBMS 注: 开源应用总是可以自由使用的。大多数时候,复制工程(利用代码)创建新应用也是被允许的。如果你对DBMS感兴趣,你可以看看一些基于这些工程的分支项目,例如MariaDB。 二、SQLiteSQLite是非凡的数据库,他可以进程在使用它的应用中。作为一个自包含、基于文件的数据库,SQLite提供了出色的工具集,可以处理所有类型的数据,没有什么限制,而且比起服务器运行的进程型服务器使用起来轻松许多。一个应用使用SQLite时,它的功能直接被集成在其中,应用会直接访问包含数据的文件(即SQLite数据库),而不是通过一些端口(port, socket)来交互。感谢这种底层技术,这使SQLite变得非常快速和高效,并且十分强大。1、SQLite支持的数据类型NULL NULL值INTEGER 有符号整数,按照设置用1、2、3、4、6或8字节存储REAL 浮点数,使用8字节IEEE浮点数方式存储TEXT 文本字符串,使用数据库编码存储(UTF-8, UTF-16BE 或 UTF-16LE)BLOB 二进制大对象,怎么输入就怎么存储 2、SQLite 的优点基于文件 整个数据库都包含在磁盘上的一个文件中,因此它有很好的迁移性标准化 尽管它看起来像个“简化版”的数据库,SQLite 确实支持 SQL。它略去了一些功能(RIGHT OUTER JOIN 和 FOR EACH STATEMENT),但是,又同时增加了一些其他功能对开发乃至测试都很棒 在绝大多数应用的开发阶段中,大部分人都非常需要解决方案能有并发的灵活性。SQLite 含有丰富功能基础,所能提供的超乎开发所需,并且简洁到只需一个文件和一个 C 链接库 3、SQLite的缺点没有用户管理 高级数据库都能支持用户系统,例如,能管理数据库连接对数据库和表的访问权限。但由于 SQLite 产生的目的和本身性质(没有多用户并发的高层设计),它没有这个功能缺乏额外优化性能的灵活性 仍然是从设计之初,SQLite 就不支持使用各种技巧来进行额外的性能优化。这个库容易配置,容易使用。既然它并不复杂,理论上就无法让它比现在更快,其实现在它已经很快了 4、什么时候要用 SQLite嵌入式应用 所有需要迁移性,不需要扩展的应用,例如,单用户的本地应用,移动应用和游戏代替磁盘访问 在很多情况下,需要频繁直接读/写磁盘文件的应用,都很适合转为使用 SQLite ,可以得益于 SQLite 使用 SQL 带来的功能性和简洁性测试 它能秒杀大部分专门针对应用业务逻辑(也就是应用的主要目的:能完成功能)的测试 5、什么时候不要用SQLite多用户应用 如果你在开发的应用需要被多用户访问,而且这些用户都用同一个数据库,那么相比 SQLite 最好还是选择一个功能完整的关系型数据库(例如 MySQL)需要大面积写入数据的应用 SQLite 的缺陷之一是它的写入操作。这个数据库同一时间只允许一个写操作,因此吞吐量有限 三、MySQLMySQL 在所有大型数据库服务器中最流行的一个. 它的特性丰富,产品的开源性质使得其驱动了线上大量的网站和应用程序. 要入手 MySQL 相对简单,开发人员可以在互联网上面访问到大量有关这个数据库的信息.注意: 由于这个产品的普及性,大量的第三方应用、工具和集成库对于操作这个RDBCMS的方方面面大有帮助.Mysql没有尝试去实现SQL标准的全部,而是为用户提供了很多有用的功能. 作为一个独立的数据库服务器,应用程序同Mysql守护进程的交互,告诉它去访问数据库自身 -- 这一点不像 SQLite.1、MySQL支持的数据类型TINYINT 一个非常小的整数SMALLINT 一个小整数MEDIUMINT 一个中间大小的整数INT or INTEGER 一个正常大小的整数BIGINT 一个大的整数FLOAT 一个小的 (单精度) 浮点数,不能是无符号的那种DOUBLE, DOUBLE PRECISION, REAL 一个正常大小 (双精度) 的浮点数,不能使无符号的那种DECIMAL, NUMERIC 没有被包装的浮点数。不能使无符号的那种DATE 一个日期DATETIME 一个日期和时间的组合TIMESTAMP 一个时间戳TIME 一个时间YEAR 一个用两位或者4位数字格式表示的年份(默认是4位)CHAR 一个固定长度的字符串,存储时总是在其固定长度的空间里右对齐VARCHAR 一个可变长度的字符串TINYBLOB, TINYTEXT 一个BLOB或者TEXT列,最大长度255 (2^8 - 1)个字符BLOB, TEXT 一个BLOB或者TEXT列,最大长度 65535 (2^16 - 1)个字符MEDIUMBLOB, MEDIUMTEXT 一个BLOB或者TEXT列,最大长度 16777215 (2^24 - 1)个字符LONGBLOB, LONGTEXT 一个BLOB或者TEXT列,最大长度4294967295 (2^32 - 1) 个字符ENUM 一个枚举类型SET 一个集合 2、MySQL的优点容易使用 安装MySQL非常容易。第三方库,包括可视化(也就是有GUI)的库让上手使用数据库非常简单功能丰富 MySQL 支持大部分关系型数据库应该有的 SQL 功能——有些直接支持,有些间接支持安全 MYSQL 有很多安全特性,其中有些相当高级灵活而强大 MySQL 能处理很多数据,此外如有需要,它还能“适应”各种规模的数据快速 放弃支持某些标准,让 MySQL 效率更高并能使用捷径,因此带来速度的提升 3、MySQL的缺点已知的局限 从设计之初,MySQL 就没打算做到全知全能,因此它有一些功能局限,无法满足某些顶尖水平应用的需求可靠性问题 MySQL 对于某些功能的实现方式(例如,引用,事务,数据审核等) 使得它比其他一些关系型数据库略少了一些可靠性开发停滞 尽管 MySQL 理论上仍是开源产品,也有人抱怨它诞生之后更新缓慢。然而,应该注意到有一些基于 MySQL 并完整集成的数据库(如 MariaDB),在标准的 MySQL 基础上带来了额外价值 4、何时使用 MySQL?分布式操作 当你需要的比SQLite可以提供的更多时,把MySQL包括进你的部署栈,就像任何一个独立的数据库服务器,会带来大量的操作自由和一些先进的功能高安全性 MySQL的安全功能,用一种简单的方式为数据访问(和使用)提供了可靠的保护Web网站 和 Web应用 绝大多数的网站(和Web应用程序)可以忽视约束性地简单工作在MySQL上。这种灵活的和可扩展的工具是易于使用和易于管理的——这被证明非常有助于长期运行定制解决方案 如果你工作在一个高度量身定制的解决方案上,MySQL能够很容易地尾随和执行你的规则,这要感谢其丰富的配置设置和操作模式 5、何时不用 MySQL?SQL 服从性 因为 MySQL 没有[想要]实现 SQL 的全部标准,所以这个工具不完全符合SQL。如果你需要对这样的关系数据库管理系统进行整合,从MySQL进行切换是不容易的并发 即使MySQL和一些存储引擎能够真地很好执行读取操作,但并发读写还是有问题的缺乏特色 再次提及,根据数据库引擎的选择标准,MySQL会缺乏一定的特性,如全文搜索 四、PostgreSQLPostgreSQL 是一个先进的,开放源代码的[对象]-关系型数据库管理系统,它的主要目标是实现标准和可扩展性. PostgreSQL, 或者说是 Postgres, 试图把对 ANSI/ISO SQL标准的采用与修正结合起来.对比其他的RDBMS, PostgreSQL以它对于对象-关系和或关系型数据库功能,比如对于可靠事务,例如原子性,一致性,隔离性和持久性(ACID)的完全支持,这些东西的高度需求和集合的支持,以示其独特性.由于强大的底层技术, Postgres对于高效的完成许多处理任务很有一手. 得益于其多版本并发控制 (MVCC)的实现,在没有读取锁的前提下也能达成并发, 这也同样确保了ACID的实施.PostgreSQL是高度可编程的, 因而可以使用被称作“存储过程”的自定义程序进行扩展. 这些功能可以被创建用来简化一个写重复、复杂并且常常需要数据库操作的任务的执行.虽然特性强大,但这个 DBMS并没有MySQL那么流行, 可还是有许多迷人的第三方工具和库被设计出来用于使得对PostgreSQL的操作简化. 如今通过许多操作系统默认的包管理器轻松的获取PostgreSQL已成为可能.1、PostgreSQL支持的数据类型bigint 有符号的八位整数bigserial 自增长的八位整数bit [(n)] 固定长度的位串bit varying [(n)] 可变长度的位串boolean 逻辑布尔值(true/false)box 在一个平面上的矩形框bytea 二进制数据("位数组")character varying [(n)] 可变长度的字符串character [(n)] 固定长度的字符串cidr IPv4 或者 IPv6 网络地址circle 平面上的一个圆date 日历日期 ( 年月日)double precision 双精度浮点数(8位)inet IPv4 或者 IPv6 主机地址integer 有符号的四位整数interval [fields] [(p)] 时间跨度line 平面上的一个无限长的直线lseg 平面上的一个线段macaddr MAC (媒体访问控制)地址money 货币金额numeric [(p, s)] 可选精度的精确数字path 一个平面上的几何路径point 一个平面上的几何点polygon 一个平面上的闭合的几何路径real 单精度浮点数(4 位)smallint 有符号的两位整数serial 自增长4位整数text 可变长度字符创time [(p)] [without time zone] 一天中的时间(无时区)time [(p)] with time zone 一天中的时间,包含时区timestamp [(p)] [without time zone] 日期和时间(没有时区)timestamp [(p)] with time zone 日期和时间,包含时区tsquery 文本搜索查询tsvector 文本搜索文档txid_snapshot 用户级事务ID快照uuid 通用的唯一标识符xml XML 数据 2、PostgreSQL的优点标准支持 SQL 的开源关系型数据库 PostgreSQL 是一个开源的,免费的,同时非常强大的关系型数据管理系统强大的社区 PostgreSQL 背后有热忱而经验丰富的社区,可以通过知识库和问答网站获取支持,全天候免费强大的第三方支持 即使其本身功能十分强大,PostgreSQL 仍附带有许多强大的开源第三方工具来辅助系统的设计、管理和使用可扩展性 可以用预先存储的流程来程序性扩展 PostgreSQL ,一个高级的关系型数据库理应如此面向对象 PostgreSQL 不只是一个关系型数据库,还是一个面向对象数据库——支持嵌套,及一些其他功能3、PostgreSQL的缺点:性能 对于简单而繁重的读取操作, 超过了 PostgreSQL 的杀伤力,可能会出现比同行(如MySQL)更低的性能普及 按给出的该工具的性质,从普及度来说它还缺乏足够后台支撑,尽管有大量的部署——这可能会影响能够获得支持的容易程度托管 由于上述因素的影响,要让主机或服务提供商提出使用PostgreSQL实例是很难的 4、何时使用PostgreSQL?数据完整性 当可靠性和数据完整性是绝对必要而无需理由时,PostgreSQL是更好的选择复杂的自定义过程 如果你需要你的数据库执行自定义过程,可扩展的PostgreSQL是更好的选择整合 在将来,如果可能要把整个数据库系统迁移到另一个适当的解决方案(例如Oracle)中,PostgreSQL对于这种切换将是最兼容和易于操作的复杂的设计 相比其他的开源和免费的 RDBMS(关系数据库管理系统)实现来说,对于复杂的数据库设计,PostgreSQL提供了大部分的功能和可能性,同时并没放弃其他有价值的地方 5、何时不用 PostgreSQL?速度 如果你需要的只是快速的读取操作, PostgreSQL 不是为此而准备的工具简化体制 除非你需要绝对的数据完整性,原子性,一致性,隔离性,耐久性,或复杂的设计,PostgreSQL 对简化体制来说是杀手复制 除非你愿意花不少时间,精力和资源,否则对于那些缺乏数据库和系统管理经验的人来说,实现与MySQL的(主从)复制可能不容易PostgreSQL 的名字很少听到,最近试装发现不是很友好;官方文档写的对新手来说有点坑;有数据库工作经验的直接看最后一句就可以。如果打算为项目选择一款免费、开源的数据库,那么你可能会在MySQL与PostgreSQL之间犹豫不定。MySQL与PostgreSQL都是免费、开源、强大、且功能丰富的数据库。你主要的问题可能是:哪一个才是最好的开源数据库,MySQL还是PostgreSQL呢?该选择哪一个开源数据库呢?在选择数据库时,你所做的是个长期的决策,因为后面如果再改变决定将是非常困难且代价高昂的。你希望一开始就选择正确。两个流行的开源数据库MySQL与PostgreSQL常常成为最后要选择的产品。对这两个开源数据库的高层次概览将会有助于你选择最适合自己需要的。MySQLMySQL相对来说比较年轻,首度出现在1994年。它声称自己是最流行的开源数据库。MySQL就是LAMP(用于Web开发的软件包,包括 Linux、Apache及Perl/PHP/Python)中的M。构建在LAMP栈之上的大多数应用都会使用MySQL,包括那些知名的应用,如 WordPress、Drupal、Zend及phpBB等。一开始,MySQL的设计目标是成为一个快速的Web服务器后端,使用快速的索引序列访问方法(ISAM),不支持ACID。经过早期快速的发展之 后,MySQL开始支持更多的存储引擎,并通过InnoDB引擎实现了ACID。MySQL还支持其他存储引擎,提供了临时表的功能(使用MEMORY存 储引擎),通过MyISAM引擎实现了高速读的数据库,此外还有其他的核心存储引擎与第三方引擎。MySQL的文档非常丰富,有很多质量不错的免费参考手册、图书与在线文档,还有来自于Oracle和第三方厂商的培训与支持。MySQL近几年经历了所有权的变更和一些颇具戏剧性的事件。它最初是由MySQL AB开发的,然后在2008年以10亿美金的价格卖给了Sun公司,Sun公司又在2010年被Oracle收购。Oracle支持MySQL的多个版 本:Standard、Enterprise、Classic、Cluster、Embedded与Community。其中有一些是免费下载的,另外一 些则是收费的。其核心代码基于GPL许可,对于那些不想使用GPL许可的开发者与厂商来说还有商业许可可供使用。现在,基于最初的MySQL代码还有更多的数据库可供选择,因为几个核心的MySQL开发者已经发布了MySQL分支。最初的MySQL创建者之一 Michael "Monty" Widenius貌似后悔将MySQL卖给了Sun公司,于是又开发了他自己的MySQL分支MariaDB,它是免费的,基于GPL许可。知名的 MySQL开发者Brian Aker所创建的分支Drizzle对其进行了大量的改写,特别针对多CPU、云、网络应用与高并发进行了优化。PostgreSQLPostgreSQL标榜自己是世界上最先进的开源数据库。PostgreSQL的一些粉丝说它能与Oracle相媲美,而且没有那么昂贵的价格和傲慢的客服。它拥有很长的历史,最初是1985年在加利福尼亚大学伯克利分校开发的,作为Ingres数据库的后继。PostgreSQL是完全由社区驱动的开源项目,由全世界超过1000名贡献者所维护。它提供了单个完整功能的版本,而不像MySQL那样提供了 多个不同的社区版、商业版与企业版。PostgreSQL基于自由的BSD/MIT许可,组织可以使用、复制、修改和重新分发代码,只需要提供一个版权声 明即可。可靠性是PostgreSQL的最高优先级。它以坚如磐石的品质和良好的工程化而闻名,支持高事务、任务关键型应用。PostgreSQL的文档非 常精良,提供了大量免费的在线手册,还针对旧版本提供了归档的参考手册。PostgreSQL的社区支持是非常棒的,还有来自于独立厂商的商业支持。数据一致性与完整性也是PostgreSQL的高优先级特性。PostgreSQL是完全支持ACID特性的,它对于数据库访问提供了强大的安全性 保证,充分利用了企业安全工具,如Kerberos与OpenSSL等。你可以定义自己的检查,根据自己的业务规则确保数据质量。在众多的管理特性 中,point-in-time recovery(PITR)是非常棒的特性,这是个灵活的高可用特性,提供了诸如针对失败恢复创建热备份以及快照与恢复的能力。但这并不是 PostgreSQL的全部,项目还提供了几个方法来管理PostgreSQL以实现高可用、负载均衡与复制等,这样你就可以使用适合自己特定需求的功能 了。平台MySQL与PostgreSQL都出现在一些高流量的Web站点上:MySQL:Slashdot、Twitter、Facebook与WikipediaPostgreSQL:Yahoo使用了一个修改的PostgreSQL数据库来处理每天数以亿计的事件,还有Reddit和DisqusMySQL与PostgreSQL都能运行在多个操作系统上,如Linux、Unix、Mac OS X与Windows。他们都是开源、免费的,因此测试他们时的唯一代价就是你的时间与硬件。他们都很灵活且具有可伸缩性,可用在小型系统和大型分布式系统 上。MySQL在一个领域上要比PostgreSQL更进一步,那就是它的触角延伸到了嵌入式领域,这是通过libmysqld实现的。 PostgreSQL不支持嵌入式应用,依然坚守在传统的客户端/服务器架构上。MySQL通常被认为是针对网站与应用的快速数据库后端,能够进行快速的读取和大量的查询操作,不过在复杂特性与数据完整性检查方面不太尽如人意。 PostgreSQL是针对事务型企业应用的严肃、功能完善的数据库,支持强ACID特性和很多数据完整性检查。他们二者都在某些任务上具有很快的速 度,MySQL不同存储引擎的行为有较大差别。MyISAM引擎是最快的,因为它只执行很少的数据完整性检查,适合于后端读操作较多的站点,不过对于包含 敏感数据的读/写数据库来说就是个灾难了,因为MyISAM表最终可能会损坏。MySQL提供了修复MySQL表的工具,不过对于敏感数据来说,支持 ACID特性的InnoDB则是个更好的选择。与之相反,PostgreSQL则是个只有单一存储引擎的完全集成的数据库。你可以通过调整postgresql.conf文件的参数来改进性能,也可以调整查询与事务。PostgreSQL文档对于性能调优提供了非常详尽的介绍。MySQL与PostgreSQL都是高可配置的,并且可以针对不同的任务进行相应的优化。他们都支持通过扩展来添加额外的功能。一个常见的误解就是MySQL要比PostgreSQL更容易学习。关系数据库系统都是非常复杂的,这两个数据库的学习曲线其实是差不多的。标准兼容性PostgreSQL旨在实现SQL兼容性(当前标准是ANSI-SQL:2008)。MySQL则兼容大部分SQL,不过还有自己的扩展,可以支 持NoSQL特性,这在参考手册中都有介绍。每种方式都有优缺点。兼容标准会让数据库管理员、数据库开发者与应用开发者更舒服一些,因为这意味着他们只需 学习一套标准、一套特性和命令即可。这会节省时间,提升效率,也不会被锁定在特定的厂商上。支持使用非标准的自定义功能的人们认为这样可以快速采用新的特性,而不必等待标准进程完成。ANSI/ISO标准在不断演化,因此标准兼容性也是个 变化的目标:知名的关系型数据库Microsoft SQL Server、Oracle与IBM DB2也只是部分兼容于标准。结论虽然有不同的历史、引擎与工具,不过并没有明确的参考能够表明这两个数据库哪一个能够适用于所有情况。很多组织喜欢使用PostgreSQL,因为 它的可靠性好,在保护数据方面很擅长,而且是个社区项目,不会陷入厂商的牢笼之中。MySQL更加灵活,提供了更多选项来针对不同的任务进行裁剪。很多时 候,对于一个组织来说,对某个软件使用的熟练程度要比特性上的原因更重要
* 声明:本文由其作者或媒体撰写,观点仅代表其本身,不代表本站立场。
编辑
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
 
<< < - > >>
[C++][*] [C][*] [po][*] [JS][*] [JAVA][*] [HIS][*] [Web][*] [H][*] [GIT][*] [Android][*] [DB][*] [0][*] [TL][*] [O][*] [3D][*] [PAS][*] [IOS][*] [算法][*] [地球][*] [学习方法][*] [探索][*] [宇宙][*] [Linux][*] [阅读秘诀][*] [考试技巧][*] [...]
天天快乐生活[HappyLifeLife.com]
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士