数据库的一个小小的区分
1、 首先主要是关系型数据库、nosql数据库和缓存数据库的区别;我觉的:
关系型数据库(mysql、Oracle)就想当于一个储物柜,里边分了各种小格子,把各种数据有序的保存在里边,查询时非常方便;有比较完善的sql语句;
 mysql免费开源,自动提交事务,是基于表级别的一个事务,而Oracle不自动提交,是基于行级别的事务;mysql安装包小,使用简单,Oracle安装包较大,还会收费,更适合于大数据的处理、并发量高;
 mysql用limit进行分页,第一个参数表示启始数,第二个参数表示要查询的条数。
 oracle用伪列rownum来进行分页,因为伪列只能用小于,不能用大于,所以需要一个两层的嵌套查询。
 mysql主键可以自增。Oracle必须用序列(sequence);
字段类型有些区别;
 mysql一般都是先有用户,然后创建库、创建表。而Oracle一般是,先创建数据库,然后创建临时表空间、物理表空间,再创建用户,创建表。
nosql数据库(mongdb)就相当于一个仓库,比如把衣服放在一堆,书本放在一堆,这样他的存储效率肯定很高,但是查找时,不方便精确查找。所以nosql更适合于数据量比较大,但是数据之间关系不是特别强,或者不是特别重要的数据;比如:电商里边的评论数据;
他的collection相当于数据库,document相当于表,document中数据主要以json格式存储;
缓存数据库(redis、memcached):缓存数据库由于是保存在内存中的,所以他的存储效率非常高;但是他不适合持久化存储数据,尽管redis支持持久化,但是他也仅仅是在一定程度上保证了数据的安全性,还是有很多情况会造成数据丢失的,比如redis穿透、雪崩等。
所以他仅仅适合做为数据库和应用程序直接的中间层使用,不能作为真正的存储数据库使用。即使使用,也只能是一些不是特别重要的数据,比如购物车,在B2C的项目中,用户购物车一般都是临时存储,如果放入购物车长时间不提交,那么用户再购买的可能性很小了,所以即使丢了,也不会造成太多的损失。以这个,来换取项目的运行效率非常划算;
优化的切入点
1、 数据库选型:首先应该从数据库的选型来看,首先是关系型数据库,目前最流行的是mysql和Oracle,mysql更适合于中小型项目,安装使用比较简单,免费开源。Oracle适合于大型项目,安装包比较大,使用比较耗内存,收费,但是效率高、可靠性好,使用行级锁,比mysql的表级锁粒度更细,对并发性的支持要好的多。NOSQL数据库(比如:mongdb),事务性比较差,但效率高,主要适用于数据量比较大,但关系型要求不是很强的数据,比如评论数据。缓存数据库(比如:redis),由于保存在内存中,所以速度特别快,但是不适应持久化保存。所以缓存数据库一般作为应用和数据库的中间层来使用。
2、 设计规范:其次应该从数据库设计规范来考虑。好的规范,可以是数据库运行效率更高,优化更方便。以mysql为例;
 由于mysql对大小写在windows和linux上敏感型不一致,为了避免麻烦,我们一般建议数据库名、表名、字段名都用小写+下划线命名;
 数据库名最后于项目名称一致。
 表名最好采用:“数据库名_表名”的方式;
 字段名最后见名知意,不要太长;
 字段选用合适的字段类型,比如姓名可以用varchar(10),而不要用默认的长度255,日期最好用date或datetime或时间戳。金额最好用decimal,而不是double、float等。
 关联表以外的表最好都有主键id、创建时间、创建人、最后修改时间、最后修改人字段。
 数据库设计时,以三大范式为参考,但是必要时,可以使用冗余;
 对于预期数据量特别大的表,可能没有都会有很大增长的表,要考虑水平分表,比如系统日志表,可以考虑表名中加入月份,每月生成新表。
 对于字段比较多的表,比如企业信息表,可以考虑纵向分表,把表分成两张1对1的表。把经常查询的字段放在一张表里,不经常用到的和大文本字段放在另外一张表里。
 开发阶段,介意每个表只有主键,不应该包含其他外键。因为开发过程中,系统不稳定,可能出现很多垃圾数据,有了外键,数据的清理会给我们开发照成很多不便。要求开发人员用代码维护表之间的关系,这样更能增加代码的健壮性。
3、 索引:开发测试完成以后,一定要记得给数据库添加索引,增加sql的执行效率。添加索引也要注意,索引应该添加到经常作为查询条件或者排序字段、或者作为外键的列上。而那些不经常查询的字段、大文本字段、可选值比较少的字段(比如性别)等不需要创建索引。另外,sql中的不等于、is null、函数、like两边同时使用%等,会使索引失效,应该尽量避免使用;
4、 配置:数据库的配置优化(my.ini),比如:最大连接数、最大缓存数、最大线程数、物理内存等;
5、 读写分离、主从复制优化。因为一般查询多、修改少,索引可以增加查询效率,但会影响修改效率。所以做了读写分离以后,可以把索引只建立在读的数据库上。并且查询不需要事务,所以可以用非事务行引擎;
数据库集群,数据库压力过大时,用集群来分担压力是个很不错的方案;