内容简介:Java Web实战篇-轻松提高千万级数据库查询效率
大家在刚开始搭建项目的时候可能考虑的不够全面,随着产品的推广 、业务场景的复杂和使用用户越来越多 数据会呈现快速增长。当数据达到千万级的时候 就会发现 查询速度越来越慢 用户体验也就越来越差,那怎样提升千万级数据查询效率呢?小萌简单整理了一下,希望对大家有所帮助!
优化数据库设计:
-
数据字段类型使用 varchar/nvarchar 替换 char/nchar ,变长字段存储空间小,节省存储空间。在查询的时候小的空间字段搜索效率更高。
-
查询的时候避免全表扫描,可以在 where 和 order by 的字段上建立索引。
-
where查询子句中不对 null 值做判断,会导致检索引擎放弃使用索引而使用全表扫描,如: select id,name from user where age is null 可以设置age 的默认值为0 ,保证没有null值,修改后的 sql 查询语句为: select id,name from user where age = 0 。
-
谨慎使用索引,索引不是越多越好。一般一张表的索引数不要超过6个,如果太多要讨论业务是否合理或者是否索引建在了不常用的字段上。索引可以提高select 查询的效率,但是也响应降低了 insert和update 的效率,因为在执行insert和update时也可能会重建索引。
-
尽量不要更新索引数据,因为索引数据的顺序是表记录的物理顺序,一旦发生改变将会导致整个表记的顺序发生改变,将会消耗大量资源。如果业务需要频繁更新索引数据列 就要考虑索引是否创建合理,比如 用户ID、身份证号码或者手机号码不经常改变的列可以考虑创建索引。
-
字符型字段如果符合业务需求可以修改为数字类型字段,因为字符型字段会降低查询和连接的性能,并且增加存储的开销。执行搜索的适合查询和连接会逐个比较字符串的每一个字符,如果是数据类型比对一次就可以了。
SQL查询优化
-
where 查询语句中避免使用**!= 或 <> **操作符,搜索引擎会执行全表扫描而不执行创建的索引。
-
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 。
-
** 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 。
-
like 语句导致全表扫描,例如: select id,name from user where name like ‘%微信%’ 。
-
wehre 查询语句中避免使用参数,也会全表扫描,SQL在运行时才会进行局部变量的解析,优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。如果编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描: select id,name from user where age = @age 当然也可以改为强制使用索引: select id,name from user with(index(索引名)) where age =@ age
-
where查询语句避免使用表达式,也会导致查询的时候放弃使用索引导致全表扫描。例select id,name from user where age/2 = 10 ** 可以更改为 ** select id,name from user where age = 102*。
-
where查询语句避免使用函数操作,也会导致查询的时候放弃使用索引导致全表扫描。例如: select id,name from user where substring(name,1,3)=’abc’ 可以改为 select id,name from user where name like ‘abc%’ 。
-
不要使用select * from user 查询,要用具体的字段名。不要返回任何用不到的字段。
-
不要使用游标,大家都知道游标的效率非常差。
-
避免出现大实务业务,会降低系统的并发能力。
Java后台优化
-
使用JDBC连接数据库。
-
合理使用数据缓存。
-
控制好内存,不要全部数据放到内出做处理,可以边读边处理。
-
少创造对象。
数据库性能优化
-
使用存储过程 如果在具体业务实现过程中,可以使用存储过程操作数据库可以尽量使用,由于存储过程是存放在数据库服务器上的一次性被设计、编码、测试,被再次调用,需要执行该存储过程可以很简单的使用。可以提高响应速度,减少网络使用流量等等。
-
硬件调整 影响数据库性能的也可能是磁盘和网络吞吐量,可以通过扩大虚拟内存,把数据库服务器和主服务器分开部署。数据服务器吞吐量调为最大。
-
调整数据库 如果在实际业务实现中对表查询频率过高,可以对表创建索引;按照where查询条件建立索引,尽量为整型键建立为有且只有一个簇集索引,数据在物理上按顺序在数据页上,缩短查找范围,为在查询经常使用的全部列建立非簇集索引,能最大地覆盖查询;但是索引不可太多,执行UPDATE DELETE INSERT语句需要用于维护这些索引的开销量急剧增加;避免在索引中有太多的索引键;避免使用大型数据类型的列为索引;保证每个索引键值有少数行。
以上所述就是小编给大家介绍的《Java Web实战篇-轻松提高千万级数据库查询效率》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 7FRESH敏捷实战之工程效率实践
- Elasticsearch线上搜索查询效率核心优化深度认知-搜索系统线上实战
- 剑指offer题解笔记:时间效率和空间效率的平衡
- Kubernetes云上效率方法论,10倍研发效率提升
- 领导怼程序员:效率高不是不加班的理由!程序员:那降低效率
- 浅谈 “效率” 提升
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据库索引设计与优化
【美】Tapio Lahdenmaki、【美】Michael Leach / 曹怡倩、赵建伟 / 电子工业出版社 / 2015-6 / 79.00元
《数据库索引设计与优化》提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地估算SQL 运行的CPU 时间及执行时间,帮助读者从原理上理解SQL、表及索引结构、访问方式等对关系型数据库造成的影响,并能够运用量化的方法进行判断和优化,指导关系型数据库的索引设计。 《数据库索......一起来看看 《数据库索引设计与优化》 这本书的介绍吧!