1.选择合适的DBMS
DBMS分为SQL和NoSQL,应用何种数据库应该从实际出发。
例如应用场景是大型的项目,对数据的安全性,稳定性,速度都有很高的要求,那oracle会是比较合适的DB,因为oracle是面向企业级的数据库,里面的功能十分齐全,例如索引在我们平常应用中是一个十分重要的应用,如何设定索引是个技术活,oracle就提供了一个auto indexing的功能,它能够通过历史数据,动态的调整索引,数据字典、动态性能视图、TRACE跟踪、AWR、ASH、SQL Monitor等等,功能丰富,强大易用。使IT人员能够清晰知道DB的当下/历史工作状态、性能开销,对it开发人员十分友好,提供了全方位的技术支持,但oracle的价格昂贵
在当今互联网公司应用的最多的还是Msql,其一是因为开源免费,因为开源,大公司就能从它的底层做出相应的调整,优化,让他适合公司自身业务,而中小对性能要求或许没这么高,而mysql性能其实并不差,而且还支持事务这一重要特性
NoSQL 阵营包括键值型数据库、文档型数据库、搜索引擎、列式存储和图形数据库。这些数据库的优缺点和使用场景各有不同,比如列式存储数据库可以大幅度降低系统的 I/O,适合于分布式文件系统和 OLAP,但如果数据需要频繁地增删改,那么列式存储就不太适用了。
2.优化表的设计
1. 我们可以参考三范式原则,这样可以让我们的表更为简洁。
2. 空间和时间是可以互换的,有时候我们可以在表里面加入一些冗余的字段,这样可以获取更快的查询效率
3. 就是类型的选择,如果能够确定数据范围,能选小的尽量选小
3.优化SQL语句
优化语句的本质就是通过对SQL语句的替换,获取更高的性能,但本人觉得语句的优化无外乎2个字,索引,所以我们更应该关注的地方是什么情况下会导致索引失效,什么场景下索引是生效的,下面几种是本人在网上找到几种索引失效的场景
1. 语句中带or的,索引会失效,我们可以用union(),union_all()来代替
2. 在like语句中,若语句为like %a,索引会失效,这里如果想做优化,我们可以用elasticserch等全文搜索引擎
3. 最左范围原则,下面以name,age为顺序建立索引,讲下以下4种情况
(1)select * from USER where name=‘xzz’ and age =11;
(2)select * from USER where age=11 and name=‘xzz’;
(3)select * from USER where name >"11" and age=1;
(4) select * from USER where name="11" and age > 1;
1,4走索引,2不走,3的话name走索引,age不走索引
4. 不要对索引进行运算操作,运算操作也会使索引失效
5. 索引不存储null值,is null这种操作会使索引失效,如果0值不代表任何意义,我们可以用0值来代替null
6、in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3
4.库,表的拆分
拆分可分为水平拆分和垂直拆分,垂直拆分其实就是根据业务进行拆分,不同的业务系统都拥有自己的库,这种架构一般适合分布式架构,如rpc就是典型代表,但会造成一个问题,就是一个很小的操作都要进行rpc调用,例如这个操作只是对某个商品的库存的增减,但是因为是2个业务系统,还是要经过rpc等远程方法的调用才能完成,若调用链过长,性能也是一个瓶颈,还有一种就是水平拆分,这体现在同一张表的数据分布在不同的数据库中,这种场景一般大量的io都对同一个表进行操作,而redis等都不能满足功能性的需求,这时候就要进行水平的拆分,但水平拆分我们就要考虑数据一致性的问题,这时候我们就要应用到一些分布式锁例如zookeeper,seatas等