Java Web实战篇-轻松提高千万级数据库查询效率

bigdata 2018-01-09 15:41:09 ⋅ 943 阅读


大家在刚开始搭建项目的时候可能考虑的不够全面,随着产品的推广 、业务场景的复杂和使用用户越来越多 数据会呈现快速增长。当数据达到千万级的时候 就会发现 查询速度越来越慢 用户体验也就越来越差,那怎样提升千万级数据查询效率呢?小萌简单整理了一下,希望对大家有所帮助!

优化数据库设计:

  1. 数据字段类型使用varchar/nvarchar 替换 char/nchar,变长字段存储空间小,节省存储空间。在查询的时候小的空间字段搜索效率更高。

  2. 查询的时候避免全表扫描,可以在whereorder by 的字段上建立索引。

  3. where 查询子句中不对null值做判断,会导致检索引擎放弃使用索引而使用全表扫描,如:select id,name from user where age is null 可以设置age 的默认值为0,保证没有null值,修改后的sql查询语句为:select id,name from user where age = 0

  4. 谨慎使用索引,索引不是越多越好。一般一张表的索引数不要超过6个,如果太多要讨论业务是否合理或者是否索引建在了不常用的字段上。索引可以提高select 查询的效率,但是也响应降低了 insert和update 的效率,因为在执行insert和update时也可能会重建索引。

  5. 尽量不要更新索引数据,因为索引数据的顺序是表记录的物理顺序,一旦发生改变将会导致整个表记的顺序发生改变,将会消耗大量资源。如果业务需要频繁更新索引数据列 就要考虑索引是否创建合理,比如 用户ID、身份证号码或者手机号码不经常改变的列可以考虑创建索引。

  6. 字符型字段如果符合业务需求可以修改为数字类型字段,因为字符型字段会降低查询和连接的性能,并且增加存储的开销。执行搜索的适合查询和连接会逐个比较字符串的每一个字符,如果是数据类型比对一次就可以了。

SQL查询优化

  1. where 查询语句中避免使用**!= <> **操作符,搜索引擎会执行全表扫描而不执行创建的索引。

  2. where 查询语句中 避免使用 or 来连接条件查询数据,也会导致搜索引擎执行全表扫描而不执行创建的索引,例如:select id,name from user where age = 18 or age = 25 可以修改为 select id,name from user where age = 18 union all select id,name from user where age = 25

  3. ** in 和 not in也避免使用,也将导致全表扫描,例如:select id,name from user where age in (18,19,20)** 如果是连续的则可以考虑使用between and,例如:select id,name from user where age between 18 and 20

  4. like 语句导致全表扫描,例如:select id,name from user where name like ‘%微信%’

  5. wehre 查询语句中避免使用参数,也会全表扫描,SQL在运行时才会进行局部变量的解析,优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。如果编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:select id,name from user where age = @age 当然也可以改为强制使用索引:select id,name from user with(index(索引名)) where age =@ age

  6. where查询语句避免使用表达式,也会导致查询的时候放弃使用索引导致全表扫描。例select id,name from user where age/2 = 10 ** 可以更改为 ** select id,name from user where age = 102*。

  7. where查询语句避免使用函数操作,也会导致查询的时候放弃使用索引导致全表扫描。例如:select id,name from user where substring(name,1,3)=’abc’ 可以改为select id,name from user where name like ‘abc%’

  8. 不要使用select * from user 查询,要用具体的字段名。不要返回任何用不到的字段。

  9. 不要使用游标,大家都知道游标的效率非常差。

  10. 避免出现大实务业务,会降低系统的并发能力。


Java后台优化

  1. 使用JDBC连接数据库。

  2. 合理使用数据缓存。

  3. 控制好内存,不要全部数据放到内出做处理,可以边读边处理。

  4. 少创造对象。

数据库性能优化

  1. 使用存储过程

      如果在具体业务实现过程中,可以使用存储过程操作数据库可以尽量使用,由于存储过程是存放在数据库服务器上的一次性被设计、编码、测试,被再次调用,需要执行该存储过程可以很简单的使用。可以提高响应速度,减少网络使用流量等等。
  2. 硬件调整

     影响数据库性能的也可能是磁盘和网络吞吐量,可以通过扩大虚拟内存,把数据库服务器和主服务器分开部署。数据服务器吞吐量调为最大。
  3. 调整数据库

      如果在实际业务实现中对表查询频率过高,可以对表创建索引;按照where查询条件建立索引,尽量为整型键建立为有且只有一个簇集索引,数据在物理上按顺序在数据页上,缩短查找范围,为在查询经常使用的全部列建立非簇集索引,能最大地覆盖查询;但是索引不可太多,执行UPDATE DELETE INSERT语句需要用于维护这些索引的开销量急剧增加;避免在索引中有太多的索引键;避免使用大型数据类型的列为索引;保证每个索引键值有少数行。

跟多实战资讯请关注“IT实战联盟”公众号哦~~~



全部评论: 0

    我有话说:

    为什么说作为程序员分库分表的必要性一定要掌握?

      互联网大厂程序员必须掌握海量数据和高并发问题处理技能,期望进入大厂的程序员一定要仔细看这! MySQL 分库分表是做什么的? 相信很多程序员对 MySQL 都比较熟悉了,目前国内

    Java Web实战-代码之美

    代码之美-小小的优化让你的代码Bug更少,执行效率更高

    打造流量秒杀系统

    讲师:易乐天 前小米国际电商技术负责人 10 年软件开发经验。多年 Linux 系统编程、高性能和高并发编程经验。参与过亿用户、日活、百并发系统开发,曾经将 IM 云 WebSocket

    Java Web实战:发布和运维必备的12条Linux命令

    作为一名Java起步的从业人员,学会一些常用的Linux命令是必须的。

    Java Web架构实战:聊一聊前后端分离架构

    RESTful思想和Json数据标准的出现,使得这种交互日益便利。Vue.js 用于构建用户界面的渐进式框架

    「免费」电商高并发与秒杀实战

    IT老齐 16年Java研发与架构设计经验、前京东金融架构师、中国财政部数据平台架构师、专注送给小白的实战课、只为高薪而生、重实战,说人话,讲干货,不扯淡!

    Java Web实战:增强for循环实现原理及for循环实战性能优化

    Iterator是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator被创建之后会建立一个指向原来对象的单链索引表......

    精品推荐:Java核心数据结构(List,Map,Set)使用技巧与优化

    JDK提供了一组主要的数据结构实现,如List、Map、Set等常用数据结构。这些数据都继承自 java.util.Collection 接口,并位于 java.util 包内。

    JAVA实现附近范围内公交定位问题

    接上【前端实战:通过JS抓取城市所有站点与线路】获取附近定位信息

    Dgraph 1.2.8 发布,事务性分布式图形数据库

    Dgraph 1.2.8 发布了。Dgraph 是一个可扩展的,分布式的,低延迟的图数据库,目标是提供 Google 生产水平的规模和吞吐量,在超过 TB 的结构数据里,为用户提供足够低延迟的实时

    数据量下 MyBatis PageHelper 分页查询性能问题的解决办法

    前因 项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一直没有什么问题。随着业务扩增,数据库扩增PageHelper出现了明显的性能问题。 几十甚至上百的单表数据查询性能缓慢

    Elasticsearch 7.11.2 发布,提升缓存效率

    Elasticsearch 7.11.2 正式发布,此次更新内容如下: 增强 提高碎片请求缓存效率 #69505 Bug 修复 聚合 修正用 doc_count 执行过滤器的过滤器

    蚂蚁金服 Java RPC 开源框架—SOFARPC

    SOFARPC 是一个高可扩展性、高性能、生产Java RPC 框架。

    您应该避免的五个简单的数据库设计错误

    Anith 在他非常成功的文章 Facts and Fallacies about First Normal Form 之后,对五个常见的数据库设计错误进行了引人入胜的讨论,尽管使用它们的不幸后果

    Java 实战-JDK9新特性体验

    JDK9 已经出来好几个月了,我们一起来了解一下JDK9的一些新特性吧

    MongoDB实战:高级查询----$elemMatch与aggregate

    基本的Find查询将在其他章节示例,本文主要针对于遇到的问题与解决的方法做个记录,希望可以减少遇到这类问题的

    Google 宣布正式开源 Jib ,帮助 Java 应用快速容器化

    Google 本周宣布开源一款新的 Java 工具 Jib ,旨在让开发者使用他们熟悉的工具更轻松地将 Java 应用程序容器化。