`
ekian
  • 浏览: 6136 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。(转载)

 
阅读更多
1)数据库设计方面:

a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

c. 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

d. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

e. 应尽可能的避免更新索引数据列,因为索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新索引数据列,那么需要考虑是否应将该索引建为索引。

f. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

g. 尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

h. 尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

i. 避免频繁创建和删除临时表,以减少系统表资源的消耗。

j. 临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

k. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

l. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

2)SQL语句方面:

a. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

b. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20

c. 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

d. 下面的查询也将导致全表扫描: select id from t where name like ‘%abc%’

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

f. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: select id from t where num/2=100 应改为: select id from t where num=100*2

g. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如: select id from t where substring(name,1,3)=’abc’–name以abc开头的id select id from t where datediff(day,createdate,’2005-11-30′)=0–‘2005-11-30’生成的id 应改为: select id from t where name like ‘abc%’ select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′

h. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

i. 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 1=0 这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样: create table #t(…)

j. 很多时候用 exists 代替 in 是一个好的选择: select num from a where num in(select num from b) 用下面的语句替换: select num from a where exists(select 1 from b where num=a.num)

k. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

l. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

m. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

n. 尽量避免大事务操作,提高系统并发能力。

3)java方面:

a.尽可能的少造对象。

b.合理摆正系统设计的位置。大量数据操作,和少量数据操作一定是分开的。大量的数据操作,肯定不是ORM框架搞定的。,

c.使用jDBC链接数据库操作数据

d.控制好内存,让数据流起来,而不是全部读到内存再处理,而是边读取边处理;

e.合理利用内存,有的数据要缓存
分享到:
评论

相关推荐

    开发形状模型的框架Matlab代码.rar

    开发形状模型的框架Matlab代码.rar

    高级开发简单游戏制作,期末项目答辩小组作业

    期末项目答辩

    042Interpolation(目标规划、多元分析与插值的相关例子)Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    微信小程序搭建andora-bilerplat-what.zip

    微信小程序搭建andora-bilerplat-what

    SEPSPYR 是一个 MATLAB 工具箱,用于构建和重建可分离的正交可操纵金字塔。.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    PFC单轴压缩声发射模拟演化规律及胶结破坏能监测

    PFC单轴压缩声发射模拟演化规律及胶结破坏能监测

    046SOCPR-and-Linear-Disrflow-based-DNP-main matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    博世汽车电驱仿真模型,同步电机和异步电机模型,相电流完美波形 博世汽车电驱仿真模型,同步电机和异步电机模型,相电流完美波形,自动计算弱磁模型调用各种脚本进行foc控制,正反转切电流无波动,由于模型特殊

    博世汽车电驱仿真模型,同步电机和异步电机模型,相电流完美波形 博世汽车电驱仿真模型,同步电机和异步电机模型,相电流完美波形,自动计算弱磁模型调用各种脚本进行foc控制,正反转切电流无波动,由于模型特殊性购入不 不,谢谢(运行前要加载tc_ipmsm_config.m)

    Spring Cloud版本的分布式电子商务项目,致力于打造顶级多模块、高可用、高可扩展的电子商务项目_环云商城.zip

    Spring Cloud版本的分布式电子商务项目,致力于打造顶级多模块、高可用、高可扩展的电子商务项目_环云商城

    高维数据分析作业:图理论与矩阵范数应用(网络分析与社区检测)

    内容概要:本文档主要聚焦于2024年秋季学期高维数据分析课程的第六次作业,涉及多个关于复杂网络分析的重要概念和技术。具体涵盖:基于图论的基本证明如节点度与共同邻居的数学表达形式;对网络社区结构进行划分,并通过模态性公式评价这种划分的效果;针对实际社交网络数据集利用随机块模型和社会经济回报模型(SCORE)来进行高效的社区识别任务;以及深入探讨了矩阵的核范数及其与谱范数间的关系,强调了它们在解决现实生活中大型稀疏矩阵问题方面的重要性。 适合人群:面向正在学习数据挖掘、机器学习等相关专业的大三及以上的学生,特别是有兴趣深入了解图论及其在网络科学中具体应用的研究人员。 使用场景及目标:该文档用于帮助学生更好地掌握高维数据分析技巧,在实际项目实践中提高解决问题的能力。通过本练习可以加深对于社交网络构建、模块化计算方法的认识,同时也能加强对线性代数里关键概念的理解。这对于准备从事数据分析相关工作或进一步深造的同学非常有益。 其他说明:这份PDF材料包含了大量详细的数学推导步骤,以及具体的评分标准和作业完成时间限制(截止日期:12月29日星期日晚上十点)。为了更好地完成这门课的任务,建议配合教科书和其他参考资料一起使用,鼓励学生积极思考每个问题背后的原理。

    springboot117基于SpringBoot的企业资产管理系统.zip

    springboot117基于SpringBoot的企业资产管理系统,含有完整的源码和报告文档

    纸张复制品_有机-v2.add.zip

    纸张复制品_有机-v2.add

    【Unity天气和天空系统插件】Enviro 3 - Sky and Weather

    【Unity天气和天空系统插件】Enviro 3 - Sky and Weather Enviro 3 - Sky and Weather 是一款专为 Unity 设计的高级天气和天空系统插件,旨在为游戏或应用程序提供动态、逼真的天空和天气效果。通过此插件,开发者可以轻松地创建动态变化的天空、天气和环境条件,包括阳光、云层、风暴、雨雪等效果,极大地提升游戏或虚拟环境的沉浸感和视觉表现力。 主要功能: 动态天气系统:Enviro 3 提供了完整的天气模拟系统,支持多种天气类型(如晴天、雨天、雪天、雾霾、雷暴等),并能够根据游戏环境实时变化。天气系统的转换平滑自然,可自定义天气变化的周期和频率。 实时天空系统:插件使用先进的天空渲染技术,提供了实时的昼夜循环、动态的光照变化,以及真实的星空和太阳/月亮运动效果。支持在不同的地理位置和时间变化下模拟真实的天空。 物理光照与气候效果:Enviro 3 支持物理光照模型,能够根据天气、云层、光线强度等因素,自动调整环境光照的强度、颜色和阴影效果,提升环境的真实性。 云层和雾霾模拟:插件提供了可调的云层和雾霾效果,包括低层雾霾、高空云层、雨

    springboot146基于Spring Boot的可盈保险合同管理系统的设计与实现.zip

    springboot146基于Spring Boot的可盈保险合同管理系统的设计与实现,含有完整的源码和报告文档

    到2023!地级市绿色专利获取申请数量 1990-2023 免费分享!

    ①数据来源:自己从cnrds数据库下载的原始数据,未做任何处理 ②数据年份:不同表格不一致,很多表格比如上市公司绿色专利申请与获得都是从1991年开始的,目前除了引用里的被引用信息更新到23年11月底,其余均更新到23年底 ③数据内容:两个表格 数据清单: 各省市绿色专利申请与获得(内部是地级市) 各省市绿色专利申请情况 各省市绿色专利获得情况

    基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)

    基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目),个人大三期末大作业项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星项目源码(高分项目)基于matlab实现轨道六根数画出卫星的飞行轨迹来自低轨卫星

    脑启发决策脉冲神经网络及其应用于无人机自主任务

    内容概要:本文介绍了一种模拟人脑决策机制的脑启发型决策脉冲神经网络(BDM-SNN)模型,该模型融合了多巴胺调节与突触时程依赖的可塑性(STDP),用于加速智能体的学习与决策过程。文中描述了模型构建的具体方法、实验平台及应用场景,特别是针对无人驾驶飞行器的任务应用,如穿越窗口和避障等复杂环境任务的表现进行了详细讨论。与传统强化学习和其他生物启发方法相比,新模型不仅实现了更高精度与更快的学习速度,而且能够解释奖励预测误差和时间差分学习的关系。 适用人群:对生物启发型人工神经系统以及神经机器人感兴趣的研究人员和技术人员。 使用场景及目标:用于改进无人驾驶车辆等智能体在实际环境中做出正确行为选择的速度与准确性。特别是在需要高效、快速适应不同环境的任务中展现出了优势。 其他说明:作者团队还探讨了未来可能的方向,比如考虑更多神经递质的作用或者自动状态分类的方法,以进一步优化和发展这一领域内的研究。

    纯JS实现,用于将文本复制到剪贴板,支持IE Chrome、Firefox、Opera、Safari、IOS、Android_xe-chipboard.zip

    纯JS实现,用于将文本复制到剪贴板,支持IE Chrome、Firefox、Opera、Safari、IOS、Android_xe-chipboard

    HTML5实现的微信大转盘抽奖特效源码.zip

    这是一款基于jQuery+HTML5实现的微信大转盘抽奖效果源码,是一款可配置奖品抽奖的jQuery大转盘抽奖代码,可实现点击按钮转轮旋转实现抽奖功能,效果逼真自然,是一款非常优秀的特效源码

    腾讯云AI代码助手编程挑战赛-图片转换工具示例视频

    腾讯云AI代码助手编程挑战赛-图片转换工具示例视频

Global site tag (gtag.js) - Google Analytics