? ? ? ? 真实的程序底层运行都是难以理解的指令和接口,对于大多数不是专门从事底层工作的人来说理解困难,理解的成本也很高,从二进制0、1到最终以浏览器等方式将数据展现出来,这中间要经理九九八十一难
浏览器请求接口--->程序响应、处理接口--->程序调用数据库--->程序接收数据库的sql执行结果--->程序将返回值组装成json等数据--->浏览器接收数据展示
?
? ? ? ?这些还只是可以想象出来的大的数据流转情况,底层青涩难懂,我在这里也不过多的介绍了。本文旨在大的方向介绍系统的效率优化,因为本人学的是java开发语言。不做过多过于细致的讲解,从关键的节点进行梳理。同时对数据库最常用的优化方式建立索引做了相对详细的介绍。任何事情都不是绝对的,程序、数据库也是一样,一定要根据自己的业务,选择合适的优化方案。没有最合适的方案,只有最合理的方案。? ?
? ? ? ? 在系统应用后,产生大量的业务数据,这时候系统的运行效率、查询效率等都会出现问题,这个时候最直接有效的方法就是增加硬件设备(服务器、网络带宽、交换机等);但是这也会带来成本的增加。
? ? ? ? 除过增加硬件设备的配置之外,还可以在程序的设计上面进行优化、重构。java虚拟机提供了可靠、强大的内存管理机制。但是如果程序员的框架、架构设计不合理也会导致程序在运行的过程中出现内存不够用甚至内存溢出的情况。
? ? ? ? 使用微服务、负载均衡等手段也可以在一定程度上缓解程序的运行效率,这些都是很不错的选择
? ? ? ? 在增加硬件设备配置、程序优化、重构之后,可以解决90%的问题。如果程序依然卡顿。可以通过一些手段查看数据库执行sql问题,这个时候就可以从数据库层面进行再次优化,数据库索引是最直接、有效的办法
? ? ? ?数据库索引也不是万能的,也要根据业务的需要谨慎添加,它也是把双刃剑,再提高查询效率的同时,也会给数据库、程序甚至硬件设备带来额外的开销
? ? ? 数据库创建索引应该注意一下几个方面的问题:
1、在频繁插叙的字段上面建立索引(例如:用户名、姓名、单号等经常使用的字段)
2、避免在重复数据过多的字段上面建立索引(这样会给数据库代码巨大的额外开销),尽量在数据具有唯一性的字段创建索引,比如手机号等信息
3、索引类型要和字段的类型匹配(这个很好理解,就比如存了大量文字的字段使用文本索引类型,其他的同理。只有类型匹配,索引才能发挥它的作用。如果类型不匹配同样会给数据库带来额外的运行成本,这样数据库索引也就失去了它原本的作用)
4、不要在数据量巨大的表建立索引,尽量在数据量少的表建立索引(因为数据库在建立索引之后,磁盘也会开辟出相应的空间来存储,索引的本质就是预加载数据,会占用磁盘空间。这个原理类似windows系统的查询缓存,每次使用360等工具清理磁盘的时候就会发现这些问题),如果数据量巨大可以考虑分库、分表、拆分业务等手段来优化,比建立索引效率更高
5、在经常分组、排序、联合查询等字段建立索引效率更高
6、删除不再使用的索引,因为索引会占用数据库资源和磁盘空间
7、经常修改、更新的字段不要建立索引。索引主要解决查询查询速度的,你想一下经常更新,每次更新索引就要更新。这样不仅不能提高数据库的效率,结果是适得其反。底层的原理很抽象,不再这里介绍
8、不建议在一个字段建立多个索引,还是同样的道理,程序、数据库都有一定的执行规则,违反正常的规则,看似也不回报错,日积月累,也会造成程序、数据库运行出现各种奇奇怪怪的bug
创建索引语句:
create index 索引名称 on 表名(字段名);?
下面说下分库、分表的事:
先上个图,尝尝咸淡,理解过度一下
不合理的分库、分表同样会给数据库、程序造成额外的压力
分库之后,程序的查询、数据库的sql都要相应的作出更改
分表之后也会造成字段重复的问题、关联查询问题等
垂直分割
一般是指将一个表的列进行分割,将常用的列和不常用的列进行分割;比如订单表里面的单号、制单人等信息就是使用频率很高的字段,类似开户行、经纬度等这些字段就不常用,只有在个别统计的情况下会使用到
垂直分割的优点:简化表结构,提高查询效率
垂直分割的缺点:主键冗余问题,sql语句也会增加join关键字的使用频率,sql语句都更改了,程序随之也会更改
水平分割
一般是指对数据量过大的表,可以根据业务、用户、状态等字段拆分成多张表,例如订单表,可以根据用户,有相同组织的用户的数据存在同一张表。也可以根据状态订单签收的数据和未签收的数据分表存在不同的表中
水平分割的优点:使得单表的数据量骤减,查询效率会显著的提升
水平分割的缺点:sql语句会增加union、union all关键字的使用频率,同样sql语句都更改了,程序随之也会更改;其次是如果数据量不大,简单的业务同时操作多张表的数据,造成额外的数据库开销
更深入的问题后续更新... ...