数据库语句优化的10个原则
阿里数据库开发规约
阿里数据库开发规约摘要:1.阿里数据库开发规约概述2.数据库架构设计3.数据库表设计4.数据库索引设计5.数据库存储过程和触发器设计6.数据库性能优化7.数据库安全管理8.数据库开发规范正文:阿里数据库开发规约概述阿里数据库开发规约是阿里巴巴针对数据库开发过程中所涉及的各个方面制定的一套规范。
旨在提高数据库开发的效率、保障数据安全、优化数据库性能以及降低维护成本。
本文将从数据库架构设计、数据库表设计、数据库索引设计、数据库存储过程和触发器设计、数据库性能优化、数据库安全管理以及数据库开发规范等方面进行详细阐述。
1.数据库架构设计在数据库架构设计阶段,需要遵循以下原则:- 选择合适的数据库类型,如关系型数据库、NoSQL 数据库等;- 根据业务需求,规划数据库的分布式架构;- 设计合理的数据分区、分表策略,以应对海量数据存储需求;- 确保数据一致性、可用性和可扩展性。
2.数据库表设计在数据库表设计阶段,需要遵循以下原则:- 合理规划表结构,遵循规范化设计原则;- 选择合适的字符集、存储类型等参数;- 设计合适的主键、外键约束,确保数据完整性;- 使用合适的索引策略,提高查询效率。
3.数据库索引设计在数据库索引设计阶段,需要遵循以下原则:- 选择合适的索引类型,如B+树索引、哈希索引等;- 设计合理的索引列顺序,降低查询成本;- 避免过多的索引,以免影响写操作的性能;- 定期分析索引使用情况,进行优化。
4.数据库存储过程和触发器设计在数据库存储过程和触发器设计阶段,需要遵循以下原则:- 使用存储过程封装复杂业务逻辑,提高代码可维护性;- 使用触发器实现数据约束、数据同步等需求;- 避免存储过程和触发器过于庞大,影响性能;- 定期审查存储过程和触发器,进行优化。
5.数据库性能优化在数据库性能优化阶段,需要遵循以下原则:- 对数据库进行定期的性能分析,发现性能瓶颈;- 合理调整数据库参数,提高数据库性能;- 对数据库进行定期的物理优化,如碎片整理、表重组织等;- 优化SQL 语句,提高查询效率。
数据库设计的技术和方法
数据库设计的技术和方法数据库设计是一项非常重要的任务,它涉及到了数据架构的规划、设计和实现等多个方面。
数据库设计技术和方法是一项需要深入研究和实践的工作,本文将介绍数据库设计的技术和方法,以及在实际应用中如何优化数据库设计。
一、数据库设计的主要原则在进行数据库设计之前,需要明确数据库设计的主要原则,以确保设计的完整性、准确性和可维护性。
1、数据规范化数据规范化是数据库设计的核心原则,它可以将数据分为多个表,减少数据冗余性和增强数据的完整性。
一般来说,进行规范化的方法包括将数据分解成多个粒度更小的表,消除冗余数据,并确保每个表都有一个清晰的主键。
2、数据完整性在数据库设计中确保数据的完整性是至关重要的,这意味着所有的数据都应该进行验证,以确保它们是准确的、合法的和一致的。
数据完整性的保证可以通过设计各种规则、约束和触发器来实现。
3、系统的可扩展性数据库应当具有可扩展性属性,这意味着应该在设计中预留可扩展和可变更性。
遵循这一原则可以使数据库在未来的升级与维护中更加方便。
二、数据库设计的技术1、概念结构设计概念结构设计是对数据的规划和定义,包括整个业务的对象、数据流和数据定义等。
其目的是理清业务流程,确定模型及其关系,为后续的物理设计提供思路。
2、逻辑结构设计逻辑结构设计是建立在概念结构设计之上,表现了业务的实现方式,包括数据库结构、实体、关系、数据表和数据类型等。
逻辑设计是基本结构设计宏观描述的过程。
3、物理结构设计物理结构设计是在逻辑结构设计基础上,将数据存储到物理设备上的过程。
包括如何存储数据、哪些数据用哪种数据存储方式,以及如何为在数据访问时提供最高的性能。
三、数据库设计的优化技巧1、优化表结构在数据库设计中,必须仔细分析建立的各个表之间的关系。
这可以通过优化表结构来实现。
可以从减小纵向关系数量、增加横向关联表的数量等方面入手,以减轻表的负载。
2、优化查询语句查询语句是在数据库中查找记录的主要方法。
数据库设计的基本原则是
数据库设计的基本原则是数据库设计的基本原则是确保数据的完整性、一致性、可靠性和可扩展性。
一个好的数据库设计应该能够满足用户需求,并且能够有效地存储和检索数据。
以下是数据库设计的一些基本原则:1. 数据库范式化- 第一范式(1NF):确保每个属性都是原子的,不可再分。
- 第二范式(2NF):确保非主键属性完全依赖于主键。
- 第三范式(3NF):确保非主键属性不依赖于其他非主键属性。
2. 数据库冗余最小化- 避免在多个表中存储相同的数据,通过建立关联来实现数据共享和一致性。
- 使用外键来建立表之间的关系,避免重复数据。
3. 数据库安全性- 设置适当的访问权限和角色,限制用户对敏感数据的访问。
- 使用加密算法对敏感信息进行加密存储,确保数据在传输和存储过程中的安全。
4. 数据库备份与恢复- 定期备份数据库以防止意外数据丢失。
- 建立有效的恢复机制,以便在需要时能够快速恢复数据库。
5. 数据库索引优化- 根据查询需求创建适当的索引,以提高查询性能。
- 避免创建过多的索引,因为过多的索引会增加写操作的开销。
6. 数据库性能优化- 使用合适的数据类型和字段长度来减少存储空间和提高查询效率。
- 优化查询语句,避免全表扫描和不必要的连接操作。
- 定期进行数据库性能监控和调优,以保持数据库的高性能。
7. 数据库一致性与完整性- 使用约束来确保数据的一致性和完整性,如主键、外键、唯一约束等。
- 设置触发器来处理复杂的业务规则和数据验证。
8. 数据库可扩展性- 设计合理的表结构以支持未来业务需求的扩展。
- 考虑使用分区表或分布式数据库来提高系统的可扩展性。
9. 数据库文档化- 记录数据库设计和架构,包括表结构、关系图、索引等信息。
- 编写清晰详细的数据库文档,方便后续维护和开发人员理解数据库结构。
10. 数据库规范化与反规范化- 根据实际需求进行规范化或反规范化处理,平衡数据存储和查询性能的需求。
总结:数据库设计的基本原则包括范式化、冗余最小化、安全性、备份与恢复、索引优化、性能优化、一致性与完整性、可扩展性和文档化。
数据库的优化面试题
数据库的优化面试题一、数据库的优化意义及原则数据库的优化是提高数据库性能和响应速度的关键步骤。
通过优化数据库结构、查询语句、索引和硬件设备等方面,可以提高数据库的效率和性能。
在进行数据库优化时,需要遵循以下原则:1. 数据库设计的规范化:将数据库表设计成结构合理、无冗余的形式,减少数据冗余,提高数据库的查询和更新效率。
2. 合理的索引设计:根据实际查询需求,对数据库表中的字段加索引,提高查询效率。
但是过多的索引也会增加数据库的存储空间和更新操作的开销,因此需要权衡索引的数量和频繁使用的字段。
3. 优化数据库查询语句:避免在查询语句中使用不必要的关联、多层子查询和函数操作,减少查询的复杂度,提高查询效率。
4. 恰当的硬件设备配置:数据库的性能不仅与软件优化有关,还与硬件设备的配置有关。
合理选择存储设备、内存和CPU等硬件配置,提高数据库的读写速度。
二、数据库优化面试题以下是一些常见的数据库优化面试题,供参考:1. 什么是数据库索引?请解释一下索引的作用和优化策略。
索引是数据库中对某一列或多列进行排序的一种结构,用于提高数据库查询的效率。
索引可以加快数据的查找速度,减少数据库的IO访问次数,提高查询效率。
优化策略包括根据查询需求选择合适的字段进行索引,避免过多的索引和频繁的更新操作。
2. 数据库查询语句中join和子查询有什么区别?在性能上有何影响?Join是通过连接两个或多个表的共同字段来获取结果集,而子查询是在查询语句的内部查询中嵌套了一个完整的查询语句。
在性能上,Join一般比子查询具有更好的性能,因为Join可以利用索引进行高效的连接操作,而子查询需要执行多次查询语句。
3. 如何优化SQL查询语句的性能?- 使用合适的索引:根据查询语句的条件选择合适的字段进行索引,尽量避免全表扫描。
- 减少不必要的关联和子查询:避免使用复杂的查询语句,尽量简化查询条件。
- 避免在查询条件和索引字段上进行类型转换:类型转换会导致索引失效,降低查询效率。
drupal10 数据库结构
一、概述Drupal是一个开源的内容管理系统(CMS),在全球信息站开发中得到了广泛的应用。
作为一个功能强大的CMS,Drupal 需要一个强大的数据库来支持其各种功能和模块。
Drupal 10数据库结构的设计和优化将对全球信息站的性能和扩展性产生深远的影响。
二、数据库概述1. 数据库引擎:Drupal 10 默认使用 MySQL 或 MariaDB 作为其数据库引擎,也可以支持 PostgreSQL、SQLite 或 Microsoft SQL Server。
2. 数据表和字段:Drupal 10 的数据库中包含了大量的数据表和字段,用来存储全球信息站的内容、配置、用户信息等。
其中,最常见的包括节点(node)、用户(user)、角色(role)、权限(permission)等。
三、数据库设计原则1. 规范化:Drupal 10 的数据库设计遵循了数据库规范化的原则,以减少数据冗余,提高数据的一致性和完整性。
2. 引用完整性:数据库中的外键和引用关系被严格控制,保证数据的准确性和一致性。
3. 性能优化:针对 Drupal 10 的特点,数据库的设计需要考虑性能优化,包括索引的设计、查询语句的优化等。
四、节点(node)数据表结构1. node 表:node 表存储了全球信息站中的各种内容节点,包括文章、页面、评论等。
字段包括:nid(节点 ID)、type(节点类型)、title(标题)、created(创建时间)等。
2. node_revision 表:node_revision 表存储了节点的历史版本信息。
字段包括:vid(版本 ID)、nid(节点 ID)、title(标题)、timestamp(时间戳)等。
五、用户(user)数据表结构1. users 表:users 表存储了全球信息站的用户信息。
字段包括:uid(用户 ID)、name(用户名)、m本人l(电流新箱位置区域)、created(注册时间)等。
oracle优化原则和方法
在oracle数据库管理中,优化是最重要的一项,也是最基础的一项。
oracle优化是为了改善数据库访问性能,使其更加高效。
要进行优化,就需要正确的方法和原则,下面介绍oracle优化的一些原则和方法。
一、优化原则1.应限制数据库大小,减少数据库扩充带来的影响,进而节省存储空间;2.应注重数据库索引结构优化,引起合理分类,改善搜索效率;3.应使用合理的逻辑结构,使得访问表时,扫描表行越少越高;4.应尽量避免使用全表扫描,从而提高数据处理速度;5.应尽量避免在数据库中使用触发器或存储过程,以免增加不必要的开销;6.应注重事务处理,尽量避免使用长事务;7.应尽量减少事务完成时间,避免不必要的资源锁定;8.应使用合理的架构逻辑结构,避免将多个大表同时加载到内存中;9.应限制数据库连接数,减少用户的等待时间和系统的负荷;10.应尽可能用正确的方式和有效的技术来优化系统。
二、优化方法1.创建索引:创建正确的索引对于提高oracle数据库的性能非常重要。
创建索引时,要考虑建立索引应包括的列和索引的类型;2.优化SQL语句:通过修改或优化SQL语句,可以使oracle数据库更加高效;3.改善数据库可用性:通过合理的备份与恢复措施,以及采用定期维护慢查询SQL和检查数据的一致性等技术,可以改善数据库的可用性;4.监控调优:可以通过oracle数据库定期监控功能,监控各种资源消耗情况,并深入分析SQL表达式,进行针对性的优化;5.定期重建表和索引:定期重建表和索引,能够使oracle数据库性能得到改善;6.合理分区:oracle数据库中用到分区表来改进query语句执行速度,减少用户的时间等待;以上是oracle优化的原则和方法,以改善oracle数据库的性能,。
SQL优化----百万数据查询优化
SQL优化----百万数据查询优化百万数据查询优化1.合理使⽤索引 索引是数据库中重要的数据结构,它的根本⽬的就是为了提⾼查询效率。
现在⼤多数的数据库产品都采⽤IBM最先提出的ISAM索引结构。
索引的使⽤要恰到好处,其使⽤原则如下: ●在经常进⾏连接,但是没有指定为外键的列上建⽴索引,⽽不经常连接的字段则由优化器⾃动⽣成索引。
●在频繁进⾏排序或分组(即进⾏group by或order by操作)的列上建⽴索引。
●在条件表达式中经常⽤到的不同值较多的列上建⽴检索,在不同值少的列上不要建⽴索引。
⽐如在雇员表的“性别”列上只有“男”与“⼥”两个不同值,因此就⽆必要建⽴索引。
如果建⽴索引不但不会提⾼查询效率,反⽽会严重降低更新速度。
●如果待排序的列有多个,可以在这些列上建⽴复合索引(compound index)。
●使⽤系统⼯具。
如Informix数据库有⼀个tbcheck⼯具,可以在可疑的索引上进⾏检查。
在⼀些数据库服务器上,索引可能失效或者因为频繁操作⽽使得读取效率降低,如果⼀个使⽤索引的查询不明不⽩地慢下来,可以试着⽤tbcheck⼯具检查索引的完整性,必要时进⾏修复。
另外,当数据库表更新⼤量数据后,删除并重建索引可以提⾼查询速度。
2.避免或简化排序 应当简化或避免对⼤型表进⾏重复的排序。
当能够利⽤索引⾃动以适当的次序产⽣输出时,优化器就避免了排序的步骤。
以下是⼀些影响因素: ●索引中不包括⼀个或⼏个待排序的列; ●group by或order by⼦句中列的次序与索引的次序不⼀样; ●排序的列来⾃不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提⾼是值得的)。
如果排序不可避免,那么应当试图简化它,如缩⼩排序的列的范围等。
3.消除对⼤型表⾏数据的顺序存取 在嵌套查询中,对表的顺序存取对查询效率可能产⽣致命的影响。
⽐如采⽤顺序存取策略,⼀个嵌套3层的查询,如果每层都查询1000⾏,那么这个查询就要查询10亿⾏数据。
数据库设计规范详细说明
数据库设计规范详细说明1.选择适当的数据库引擎在进行数据库设计之前,根据应用的需求选择适当的数据库引擎是非常重要的。
常见的数据库引擎有关系型数据库(如MySQL、Oracle)和非关系型数据库(如MongoDB、Redis)。
根据应用的特点和数据处理的要求,选择合适的数据库引擎是数据库设计的首要步骤。
2.确定数据表之间的关系在进行数据库设计时,根据实际需求确定数据表之间的关系是至关重要的。
主要有三种关系:一对一关系、一对多关系和多对多关系。
通过合理划分实体和识别实体之间的关系,能够建立正确的数据库表结构,提高数据的存储效率和查询效率。
3.使用适当的数据类型在设计数据库表时,需要根据数据的特点选择适当的数据类型。
例如,对于整数类型的数据,可以选择INT、BIGINT等;对于浮点数类型的数据,可以选择FLOAT、DOUBLE等。
正确选择数据类型有助于增加数据库的存储效率和查询效率,并避免数据冗余和损失。
4.设计合理的主键和索引主键是用于唯一标识数据表中每一条记录的字段,对于数据的唯一性和完整性非常重要。
在设计数据库表时,需要为每一个数据表设置适当的主键。
此外,为了提高查询效率,还需要为常用的查询字段设置索引,但是过多的索引也会影响数据库的性能,所以需要根据实际情况进行权衡。
5.规范命名规则在设计数据库表和字段时,需要遵循一套规范的命名规则。
命名应该具有一定的描述性,能够准确地表达出字段的含义和作用。
同时,应该避免使用特殊字符和关键字作为命名,以免引起语法错误和冲突。
6.定期备份和优化数据库数据库是应用中最重要的组成部分之一,所以定期备份数据库是非常重要的。
备份能够保证在数据丢失或数据库出现故障时能够恢复数据。
此外,还需要定期对数据库进行优化,包括对表的结构进行优化、对索引进行优化、对查询语句进行优化等,以提高数据库的性能和稳定性。
7.设计良好的数据表结构良好的数据表结构能够提高数据的存储效率和查询效率,并且易于维护和扩展。
如何优化数据库提高查询效率
如何优化数据库提高查询效率数据库优化是提高数据库查询效率的关键步骤。
以下是一些可以帮助优化数据库性能的方法。
1.设计良好的数据库结构:数据库的表结构应该合理设计,遵循数据库规范化原则。
避免重复数据,确保表中的字段在逻辑上相关联。
良好的数据库结构可以减少数据冗余,提高查询效率。
2.选择适当的数据类型:选择适当的数据类型可以减少存储空间,并且查询速度更快。
例如,使用整数替代文本字符串,可以节省存储空间并提高查询效率。
3.建立索引:索引是一种数据结构,可以加快数据库查询。
根据查询频率和查询字段的选择,建立适当的索引可以提高查询效率。
需要注意的是,过多的索引可能导致性能下降,因此需要权衡索引的数量和查询速度。
4.使用合适的查询语句:在编写查询语句时,使用适当的关键字和操作符可以提高查询效率。
避免使用通配符查询,尽量使用具体的条件,以减少查询时间和资源消耗。
5.利用缓存:数据库缓存是一种将查询结果存储在内存中,以便下次查询时可直接提取的机制。
通过使用缓存,可以大大提高查询速度。
可以使用数据库自带的缓存机制,或者使用第三方缓存解决方案。
6.优化查询语句:通过优化查询语句,可以减少数据库的工作量,提高查询效率。
可以使用查询优化器来帮助确定最佳执行计划,并使用分析工具来查找慢查询语句和优化建议。
7.批量操作:对于批量的数据操作,使用批处理命令可以减少与数据库的交互次数,提高效率。
例如,使用INSERT INTO ... VALUES (val1), (val2), ...的批量插入方式,可以快速插入大量数据。
8.垂直拆分和水平拆分:如果数据库中存在大量数据,可以考虑对数据库进行垂直或水平拆分。
垂直拆分是将不同的表拆分到不同的数据库中,水平拆分是将一个表拆分到多个数据库或服务器中。
拆分后的数据库可以分担负载,提高查询效率。
9.定期清理和优化数据库:定期删除不再需要的数据,清理无用的索引,重组表碎片等操作可以提高数据库性能。
PB优化原则
程序优化原则前言近来有很多医院反映网络速度较慢的情况,为此技术支持中心结合原来培训文档及工作经验,整理成该文档,提供给各位参考,以便在客户化或者问题解决过程当中可以参照使用。
另外,因为这些应验均从技术人员日常工作中积累选录,因能力所限,所以有不正确的地方,还望大家反馈,以便真正的指导我们的工作。
程序优化原则索引设计原则1、当要在一个合理的时间内结束查询时,应避免添加索引,因为索引会降慢更新操作的速度并消耗额外的空间。
有时候还可能存在覆盖好几个查询的大型索引。
2、基数较大的列很适合用来做索引。
3、避免添加与已有的索引相似的索引。
因为这样会给优化器带来更多的工作,并且会降慢更新操作的速度。
相反,我们应该修改已有的索引,使其包含附加的列。
例如,假设在一个表的(c1,c2) 上有一个索引i1。
您注意到查询中使用了"where c2=?",于是又创建一个(c2) 上的索引i2。
但是这个相似的索引没有添加任何东西,它只是i1 的冗余,而现在反而成了额外的开销。
4、如果表是只读的,并且包含很多的行,那么可以尝试定义一个索引,通过CREATEINDEX 中的INCLUDE 子句使该索引包含查询中引用的所有列(被INCLUDE 子句包含的列并不是索引的一部分,而只是作为索引页的一部分来存储,以避免附加的数据FETCHES)。
5、有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;6、经常同时存取多列,且每列都含有重复值可考虑建立组合索引。
;7、组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。
8、检查所有的统计及查询模块的主要查询条件,在查询条件经常使用的列上可以考虑添加索引。
9、因为索引要耗费另外管理上的开销,应该避免建立垃圾索引,如一张表上不要建立过多的索引,一般不要超过5个,不要在只有几个值(如该列的值只为0或者1)的列上建立索引,不要在有NULL值的列上建立索引。
数据库性能优化的关键技术分析
数据库性能优化的关键技术分析在当今数字化时代,数据库作为信息存储和管理的核心组件,其性能的优劣直接影响着整个系统的运行效率和用户体验。
无论是大型企业的核心业务系统,还是小型应用的后台数据支撑,都离不开高效稳定的数据库。
因此,深入研究和掌握数据库性能优化的关键技术,对于提升系统性能、降低成本、增强竞争力具有重要意义。
数据库性能优化是一个综合性的工作,涉及到多个方面的技术和策略。
下面我们将从硬件、数据库设计、索引优化、查询优化、存储优化以及参数配置等几个关键技术方面进行详细分析。
一、硬件优化硬件是数据库性能的基础,合理的硬件配置可以为数据库的高效运行提供有力保障。
首先,服务器的 CPU 性能至关重要。
多核、高主频的 CPU 能够更快地处理并发请求和复杂的计算任务。
对于数据量庞大、事务频繁的数据库系统,选择性能强劲的 CPU 可以显著提高处理速度。
其次,内存的大小和性能也会直接影响数据库的运行效率。
足够的内存可以缓存常用的数据和索引,减少磁盘 I/O 操作。
采用高速的DDR4 甚至 DDR5 内存,并合理配置内存大小,能够有效提升数据库的响应速度。
再者,磁盘的性能也是需要重点关注的。
传统的机械硬盘在随机读写性能上存在较大的瓶颈,而固态硬盘(SSD)则具有更快的读写速度和更低的延迟。
使用 SSD 作为数据库的数据存储介质,或者采用磁盘阵列(RAID)技术,如 RAID 10,可以提高磁盘的读写性能和数据可靠性。
此外,网络带宽也是影响数据库性能的一个因素。
对于分布式数据库或者远程访问数据库的场景,高速稳定的网络连接能够减少数据传输的延迟,提高数据交互的效率。
二、数据库设计优化良好的数据库设计是实现高性能的前提。
在数据库建模阶段,要遵循规范化的设计原则,合理规划数据表的结构,避免数据冗余和不一致性。
但过度规范化可能会导致过多的关联操作,影响查询性能。
因此,在某些情况下,可以适当进行反规范化设计,以减少关联操作的开销。
数据库优化方案
数据库优化方案1. 高效地进行SQL语句设计:通常情况下,可以采用下面的方法优化SQL对数据操作的表现:(1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。
(2)尽量使用相同的或非常类似的SQL语句进行查询,这样不仅充分利用SQL共享池中的已经分析的语法树,要查询的数据在SGA中命中的可能性也会大大增加。
(3)避免不带任何条件的SQL语句的执行。
没有任何条件的SQL语句在执行时,通常要进行FTS,数据库先定位一个数据块,然后按顺序依次查找其它数据,对于大型表这将是一个漫长的过程.(4)如果对有些表中的数据有约束,最好在建表的SQL语句用描述完整性来实现,而不是用SQL 程序中实现。
一、操作符优化:1、IN操作符用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。
由此可见用IN的SQL 至少多了一个转换的过程。
一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL 就不能转换了.在业务密集的SQL当中尽量不采用IN操作符.优化sql时,经常碰到使用in的语句,一定要用exists把它给换掉,因为Oracle在处理In 时是按Or的方式做的,即使使用了索引也会很慢。
2、NOT IN操作符强列推荐不使用的,因为它不能应用表的索引。
用NOT EXISTS或(外连接+判断为空)方案代替3、IS NULL或IS NOT NULL操作判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。
用其它相同功能的操作运算代替,a is not null改为a>0 或a>’’等.不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。
sql语句优化之SQLServer(详细整理)
sql语句优化之SQLServer(详细整理)这篇⽂章主要介绍了sql语句优化之SQL Server篇,整理的⽐较详细,推荐收藏MS SQL Server查询优化⽅法查询速度慢的原因很多,常见如下⼏种1、没有索引或者没有⽤到索引(这是查询慢最常见的问题,是程序设计的缺陷)2、I/O吞吐量⼩,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不⾜5、⽹络速度慢6、查询出的数据量过⼤(可以采⽤多次查询,其他的⽅法降低数据量)7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)8、sp_lock,sp_who,活动的⽤户查看,原因是读写竞争资源。
9、返回了不必要的⾏和列10、查询语句不好,没有优化可以通过如下⽅法来优化查询1、把数据、⽇志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在⽀持。
数据量(尺⼨)越⼤,提⾼I/O越重要.2、纵向、横向分割表,减少表的尺⼨(sp_spaceuse)3、升级硬件4、根据查询条件,建⽴索引,优化索引、优化访问⽅式,限制结果集的数据量。
注意填充因⼦要适当(最好是使⽤默认值0)。
索引应该尽量⼩,使⽤字节数⼩的列建索引好(参照索引的创建),不要对有限的⼏个值的字段建单⼀索引如性别字段5、提⾼⽹速;6、扩⼤服务器的内存,Windows 2000和SQL server 2000能⽀持4-8G的内存。
配置虚拟内存:虚拟内存⼤⼩应基于计算机上并发运⾏的服务进⾏配置。
运⾏ Microsoft SQL Server? 2000 时,可考虑将虚拟内存⼤⼩设置为计算机中安装的物理内存的 1.5 倍。
如果另外安装了全⽂检索功能,并打算运⾏ Microsoft 搜索服务以便执⾏全⽂索引和查询,可考虑:将虚拟内存⼤⼩配置为⾄少是计算机中安装的物理内存的 3 倍。
将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存⼤⼩设置的⼀半)。
Oracle中优化SQL的原则
Oracle中优化SQL的原则1.已经检验的语句和已在共享池中的语句之间要完全一样2.变量名称尽量一致3.合理使用外联接4.少用多层嵌套5.多用并发语句的优化步骤一般有:1.调整sga区,使得sga区的是用最优.2.sql语句本身的优化,工具有explain,sql trace等3.数据库结构调整4.项目结构调整写语句的经验:1.对于大表的查询使用索引2、少用in,exist等3、使用集合运算1.对于大表查询中的列应尽量避免进行诸如To_char,to_date,to_number等转换2.有索引的尽量用索引,有用到索引的条件写在前面如有可能和有必要就建立一些索引.3.尽量避免进行全表扫描,限制条件尽可能多,以便更快搜索到要查询的数据如何让你的SQL运行得更快不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句.在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结:为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(1秒).一、不合理的索引设计例:表record有620000行,试看在不同的索引下,下面几个SQL的运行情况:1.在date上建有一非个群集索引select count(*) from record where date>'19991201'and date < '19991214' and amoun > 2000 --------- (25秒)select date,sum(amount) from record group by date --------- (55秒)select count(*) from record where date>'19990901' and place in ('BJ','SH') --------- (27秒)分析:date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行.2.在date上的一个群集索引select count(*) from record where date > '19991201'and date < '19991214' and amount > 2000 ---------(14秒)select date,sum(amount) from record group by date ---------(28秒)select count(*) from record where date > '19990901' and place in ('BJ','SH') ---------(14秒)分析:在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度.3.在place,date,amount上的组合索引select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000 –(26秒) select date,sum(amount) from record group by date---------(27秒)select count(*) from record where date > '19990901' and place in ('BJ, 'SH') --------- (1秒)分析:这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的.4.在date,place,amount上的组合索引select count(*) from record where date > '19991201' and date <'19991214' and amount>2000----( 1秒) select date,sum(amount) from record group by date --------- (11秒)select count(*) from record where date>'19990901' and place in ('BJ','SH') --------- (1秒)分析:这是一个合理的组合索引.它将date作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优.5.总结:缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上.一般来说:①.有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列.二、不充份的连接条件:例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在account_no 上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:select sum(a.amount) from account a,card b where a.card_no = b.card_no-------- (20秒)将SQL改为:select sum(a.amount) from account a,card b where a.card_no = b.card_no and a.account_no=b.account_no-------- ( 1秒)分析:在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用card上的索引,其I/O次数可由以下公式估算为:外层表account上的22541页+(外层表account的191122行*内层表card上对应外层表第一行所要查找的3页)=595907次I/O在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用account上的索引,其I/O次数可由以下公式估算为:外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一行所要查找的4页)= 33528次I/O可见,只有充份的连接条件,真正的最佳方案才会被执行.总结:1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案.连接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳方案.2.查看执行方案的方法用set showplanon,打开showplan选项,就可以看到连接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,302).三、不可优化的where子句1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:select * from record wheresubstring(card_no,1,4)='5378'-------- (13秒)select * from record where amount/30 < 1000-------- (11秒)select * from record where convert(char(10),date,112)='19991201'-------- (10秒)分析:where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL 优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:select * from record where card_no like '5378%'-------- (1秒)select * from record where amount < 1000*30--------(11秒)select * from record where date= '1999/12/01'-------- ( 1秒)你会发现SQL明显快起来!2.例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:select count(*) from stuff where id_no in('0','1') -------- (23秒)分析:where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化为id_no ='0' or id_no='1'来执行.我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上(根据showplan),它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果.因此,实际过程没有利用id_no上索引,并且完成时间还要受tempdb数据库性能的影响.实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间竟达到220秒!还不如将or子句分开:select count(*) from stuff where id_no='0'select count(*) from stuff where id_no='1'得到两个结果,再作一次加法合算.因为每句都使用了索引,执行时间只有3秒,在620000行下,时间也只有4秒.或者,用更好的方法,写一个简单的存储过程:create proc count_stuff asdeclare @a intdeclare @b intdeclare @c intdeclare @d char(10)beginselect @a=count(*) from stuff where id_no='0'select @b=count(*) from stuff where id_no='1'endselect @c=@a+@bselect @d=convert(char(10),@c)print @d直接算出结果,执行时间同上面一样快!总结:可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销.1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边.2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引.3.要善于使用存储过程,它使SQL变得更加灵活和高效.从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生.其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计.。
软件性能优化与调试考试
软件性能优化与调试考试(答案见尾页)一、选择题1. 软件性能优化的目标是什么?A. 提高运行速度B. 减少资源消耗C. 增加软件稳定性D. 提高用户体验2. 在进行软件性能调优时,以下哪个因素通常不是主要的考虑点?A. 硬件限制B. 程序代码质量C. 操作系统特性D. 用户请求频率3. 以下哪种方法不是提高软件性能的常用策略?A. 代码剖析B. 并行处理C. 缓存机制D. 降低硬件成本4. 在分析软件性能问题时,以下哪个工具不是常用的诊断工具有?A. 日志分析工具B. 性能监控工具C. 系统监控工具D. 代码审查工具5. 在进行软件性能测试时,以下哪个指标通常不是关键的性能指标(KPI)?A. 响应时间B. 吞吐量C. 资源利用率D. 错误率6. 以下哪种算法通常不适合在实时系统中使用?A. 分治算法B. 动态规划算法C. 近似算法D. 回溯算法7. 在软件开发过程中,以下哪个阶段不是性能优化的主要阶段?A. 需求分析阶段B. 设计阶段C. 编码阶段D. 测试阶段8. 以下哪种软件测试类型主要关注系统的性能表现?A. 功能测试B. 兼容性测试C. 性能测试D. 安全测试9. 在软件性能优化中,以下哪个原则不是基本的优化原则?A. 对症下药B. 全面分析C. 适度优化D. 保持系统稳定性10. 以下哪个选项不是减少软件性能瓶颈的有效手段?A. 优化数据结构B. 使用更快的硬件C. 减少不必要的计算D. 避免使用递归11. 软件性能优化的目标是什么?A. 提高程序运行速度B. 减少程序占用内存C. 提高程序稳定性D. 优化用户体验12. 在进行软件性能调试时,通常会使用哪些工具?A. GDB (GNU Debugger)B. ValgrindC. Chrome DevToolsD. All of the above13. 以下哪个因素通常不是影响软件性能的主要因素?A. 硬件资源限制B. 软件架构设计C. 程序代码质量D. 用户操作习惯14. 什么是缓存?它在软件性能优化中的作用是什么?A. 缓存是一种数据存储技术,用于存储经常访问的数据以提高访问速度。
数据库索引优化技巧
数据库索引优化技巧数据库索引是提高数据库查询效率的重要手段,通过适当地创建和维护索引可以大大提高数据库查询的性能。
本文将介绍一些数据库索引优化的技巧,帮助您更好地利用索引提升数据库性能。
1.合理选择索引字段:选择正确的索引字段是索引优化的关键之一。
对于经常出现在查询条件中的字段,应该优先考虑使用索引。
另外,选择重复性高、离散性好的字段作为索引字段,这样可以减少索引的大小和查询时的数据比较次数。
2.组合索引:如果查询条件中涉及到多个字段,那么可以考虑创建组合索引。
组合索引是将多个字段组合在一起创建索引,以提高查询效率。
组合索引的字段顺序也是需要考虑的,一般将区分度高的字段放在前面可以提高索引效果。
3.避免使用过多的索引:虽然索引可以提高查询性能,但是过多的索引也会造成索引维护的开销和存储空间的浪费。
应该根据实际查询需求,合理选择索引,避免创建冗余或不必要的索引。
4.使用最左前缀匹配原则:在创建组合索引时,应该遵循最左前缀匹配原则。
即在查询条件中使用组合索引时,应该尽可能使用最左边的字段,这样可以最大程度地利用索引的效果。
5.对字符串类型的字段进行前缀索引:对于较长的字符串类型的字段,可以考虑只对前缀进行索引。
这样可以减少索引的大小,提高查询性能。
但是需要注意的是,过长的前缀索引可能会导致索引失效,应该根据实际情况进行调整。
6.定期重新组织索引和统计信息:随着数据库的使用,索引和数据会发生碎片化。
定期进行索引重组织和更新统计信息,可以提高查询性能。
可以使用数据库提供的工具或者脚本,或者使用第三方工具进行索引重组织和统计信息更新。
7.注意索引与数据的一致性:在删除或修改数据时,需要注意保持索引和数据的一致性。
删除或修改数据时,同时也需要更新相应的索引,以避免查询时出现脏数据或者查询错误的结果。
8.避免频繁更新索引字段:对于频繁进行更新操作的索引字段,可能会造成索引的频繁重建,影响数据库性能。
可以考虑将频繁更新的字段与其他查询字段分开,避免频繁更新的影响。
10分钟梳理MySQL核心知识点
10分钟梳理MySQL核心知识点今天我们用10分钟,重点梳理一遍以下几方面:•数据库知识点汇总;•数据库事务特性和隔离级别;•详解关系型数据库、索引与锁机制;•数据库调优与最佳实践;•面试考察点及加分项。
一、数据库的不同类型1.常用的关系型数据库•Oracle:功能强大,主要缺点就是贵•MySQL:互联网行业中最流行的数据库,这不仅仅是因为MySQL的免费。
可以说关系数据库场景中你需要的功能,MySQL都能很好的满足,后面详解部分会详细介绍MySQL的一些知识点•MariaDB:是MySQL的分支,由开源社区维护,MariaDB虽然被看作MySQL的替代品,但它在扩展功能、存储引擎上都有非常好的改进•PostgreSQL:也叫PGSQL,PGSQL类似于Oracle的多进程框架,可以支持高并发的应用场景,PG几乎支持所有的SQL标准,支持类型相当丰富。
PG更加适合严格的企业应用场景,而MySQL更适合业务逻辑相对简单、数据可靠性要求较低的互联网场景。
2.NoSQL数据库(非关系型数据库)•Redis:提供了持久化能力,支持多种数据类型。
Redis适用于数据变化快且数据大小可预测的场景。
•MongoDB:一个基于分布式文件存储的数据库,将数据存储为一个文档,数据结构由键值对组成。
MongoDB比较适合表结构不明确,且数据结构可能不断变化的场景,不适合有事务和复杂查询的场景。
•HBase:建立在HDFS,也就是Hadoop文件系统之上的分布式面向列的数据库。
类似于谷歌的大表设计,HBase可以提供快速随机访问海量结构化数据。
在表中它由行排序,一个表有多个列族以及每一个列族可以有任意数量的列。
HBase依赖HDFS可以实现海量数据的可靠存储,适用于数据量大,写多读少,不需要复杂查询的场景。
•Cassandra:一个高可靠的大规模分布式存储系统。
支持分布式的结构化Key-value存储,以高可用性为主要目标。
SQL语句优化之JOIN和LEFTJOIN和RIGHTJOIN语句的优化
SQL语句优化之JOIN和LEFTJOIN和RIGHTJOIN语句的优化在数据库的应⽤中,我们经常需要对数据库进⾏多表查询,然⽽当数据量⾮常⼤时多表查询会对执⾏效率产⽣⾮常⼤的影响,因此我们在使⽤JOIN和LEFT JOIN 和 RIGHT JOIN语句时要特别注意;SQL语句的join原理:数据库中的join操作,实际上是对⼀个表和另⼀个表的关联,⽽很多错误理解为,先把这两个表来⼀个迪卡尔积,然后扔到内存,⽤where和having条件来慢慢筛选,其实数据库没那么笨的,那样会占⽤⼤量的内存,⽽且效率不⾼,⽐如,我们只需要的⼀个表的⼀些⾏和另⼀个表的⼀些⾏,如果全表都做迪卡尔积,这开销也太⼤了,真正的做法是,根据在每⼀个表上的条件,遍历⼀个表的同时,遍历其他表,找到满⾜最后的条件后,就发送到客户端,直到最后的数据全部查完,叫做嵌套循环查询。
1、LEFT JOIN 和 RIGHT JOIN优化在MySQL中,实现如 A LEFT JOIN B join_condition 如下:1、表B依赖赖与表A及所有A依赖的表2、表A依赖于所有的表,除了LEFT JOIN 的表(B)3、join_condition决定了怎样来读取表B,where条件对B是没有⽤的4、标准的where会和LEFT JOIN联合优化5、如果在A中的⼀⾏满⾜where和having条件,B中没有,会被填充nullRIGHT JOIN 与LEFT JOIN类似,这个位置是可以互换的LEFT JOIN 与正常JOIN之间的转换原则上当where条件,对于⽣成的null⾏总返回false时,可以直接转化为正常的join如:SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;将被转换为:SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;注:因为设置了条件t2.column2 = 5,那么对于所有的⽣成的t2为null的⾏都是不成⽴的这样的优化将⾮常快速,因为这样相当于把外连接转换为等值连接,少了很多⾏的扫描和判断。
数据库性能优化考试
数据库性能优化考试(答案见尾页)一、选择题1. 数据库性能优化的主要目标是什么?A. 提高数据检索速度B. 增加数据库的存储容量C. 提高数据库的响应时间D. 降低数据库的系统复杂性2. 在数据库性能优化中,以下哪个因素通常不是优化的关键?A. 硬件资源限制B. 数据模型选择C. 查询语句的复杂性D. 应用程序的设计3. 以下哪个操作可以提高数据库的读写效率?A. 使用索引B. 创建汇总表C. 应用物化视图D. 使用数据库分区4. 在数据库性能监控中,以下哪个指标通常用来衡量数据库的性能?A. CPU使用率B. 内存使用量C. 磁盘I/OD. 网络I/O5. 以下哪个策略通常用于减少数据库的延迟?A. 使用更快的硬件B. 对数据库进行正则化C. 优化查询语句D. 增加数据库的备份和恢复计划6. 在数据库性能优化中,以下哪个选项通常不是数据库设计师需要考虑的因素?A. 硬件架构B. 数据库模式设计C. 应用程序逻辑D. 网络带宽7. 以下哪个技术通常用于提高数据库的扩展性?A. 数据库分片B. 创建索引C. 应用程序代码优化D. 数据库标准化8. 在数据库性能优化中,以下哪个步骤通常不包括在性能评估阶段?A. 分析查询模式B. 监控物理性能指标C. 确定系统的瓶颈D. 实施性能改进措施9. 以下哪个方法通常用于提高数据库的并发访问性能?A. 使用锁机制B. 应用乐观锁C. 减少事务大小D. 使用数据库分区10. 在数据库性能优化中,以下哪个因素通常不是由数据库管理员(DBA)处理的?A. 硬件维护B. 性能调优C. 紧急故障处理D. 数据库配置管理11. 以下哪个因素通常不是数据库性能瓶颈?A. 硬件资源限制B. 查询优化C. 数据库软件配置D. 网络带宽不足12. 在数据库中,索引主要用于提高哪种类型的查询性能?A. 经常进行的全表扫描B. 经常进行的半表扫描C. 经常进行的连接操作D. 经常进行的聚合操作13. 以下哪个选项不是数据库分区的常见类型?A. 范围分区B. 列分区C. 散列分区D. 混合分区14. 数据库实例崩溃可能由以下哪种情况引起?A. 硬件故障B. 配置错误C. 数据损坏D. 紧急关闭15. 在数据库中,什么是事务的隔离级别?它如何影响并发访问?A. 事务的隔离级别定义了事务之间的隔离程度,它通过锁机制来保证数据一致性。
数据库性能优化的五种方案
数据库性能优化的五种方案文档修订摘要目录数据库性能优化的五种方案 (1)1. 概述 (4)1.1. 目的 (4)1.2. 阅读对象 (4)1.3. 名词解释 (4)1.4. 转载出处 (4)2. 操作步骤 (4) (4)2.1. 建立索引 (5)2.1.1. Mysql索引概念 (5)2.1.2. Mysql索引主要有两种结构:B+树和hash (5)2.1.3. Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引 (5)2.1.4. Mysql各种索引区别 (6)2.1.5. INNODB与MyISAM两种表存储引擎区别 (6)2.2. 优化SQL语句 (6)2.2.1. 常用策略 (6)2.2.2. 实例案例分析 (9)2.3. 优化表结构 (9)2.4. 表的拆分 (10)2.5. 分库 (10)1.概述1.1.目的数据库性能优化1.2.阅读对象1.3.名词解释1.4.转载出处https:///csflvcxx/article/details/812790242.操作步骤关系型数据库在互联网项目中应用极为广泛,今天小编就和大家分享几个数据库优化的几种方案。
2.1.建立索引数据库优化第一步就是建立合理的索引,这也是最初级的优化,也是DBA常用的优化方案!MySql索引类型有:普通索引,主键索引,唯一索引,组合索引!2.1.1.Mysql索引概念说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要占纸张的,而索引是要占磁盘空间的。
2.1.2.Mysql索引主要有两种结构:B+树和hashhash:hash索引在mysql比较少用,他以把数据的索引以hash形式组织起来,因此当查找某一条记录的时候,速度非常快.当时因为是hash结构,每个键只对应一个值,而且是散列的方式分布.所以他并不支持范围查找和排序等功能.B+树:b+tree是mysql使用最频繁的一个索引数据结构,数据结构以平衡树的形式来组织,因为是树型结构,所以更适合用来处理排序,范围查找等功能.相对hash索引,B+树在查找单条记录的速度虽然比不上hash索引,但是因为更适合排序等操作,所以他更受用户的欢迎.毕竟不可能只对数据库进行单条记录的操作.2.1.3.Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引PRIMARY KEY(主键索引)ALTER TABLE table_name ADD PRIMARY KEY ( column ) UNIQUE(唯一索引) ALTER TABLE table_name ADD UNIQUE (column)INDEX(普通索引) ALTER TABLE table_name ADD INDEX index_name ( column )FULLTEXT(全文索引) ALTER TABLE table_name ADD FULLTEXT ( column )组合索引ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )2.1.4.Mysql各种索引区别普通索引:最基本的索引,没有任何限制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在数据库应用中,程序员们通过不断的实践总结了很多经验,这些经验是一些普遍适用的规则。
每一个程序员都应该了解并记住它们,在构造SQL语句时,养成良好的习惯。
以下10条比较重要的原则供大家参考。
原则1:尽量避免在列上做运算,这样会导致索引失败。
例如原句为:
SELECT * FROM t WHERE YEAR(d) >= 2011;
优化为:
SELECT * FROM t WHERE d>= ‘2011-01-01’;
原则2:使用join时,应该用小结果集驱动大结果集。
同时把复杂的join查询拆分成多个query。
因为join多个表时,可能导致更多的锁定和堵塞。
例如:
SELECT * FROM a JOIN b ON a.id = b.id
LEFT JOIN c ON c.time = a.date
LEFT JOIN d ON c.pid = b.aid
LEFT JOIN e ON e.cid = a.did
原则3:注意like模糊查询的使用,避免%%。
例如原句为:
SELECT * FROM t WHERE name LIKE ‘%de%’
优化为:
SELECT * FROM t WHERE name >= ‘de’AND name <= ‘df’
原则4:仅列出需要查询的字段,这对速度不会有明显的影响,主要考虑节省内存。
例如原句为:
SELECT * FROM Member;
优化为:
SELECT id,name,pwd FROM Member;
原则5:使用批量插入语句节省交互。
例如原句为:
INSERT INTO t(id,name)VALUES(1,’a’);
INSERT INTO t(id,name)VALUES(2,’b’);
INSERT INTO t(id,name)VALUES(3,’c’);
优化为:
INSERT INTO t(id,name)VALUES(1,’a’),(2,’b’),(3,’c’);
原则6:limit的基数比较大的时候使用between。
例如原句为:
SELECT * FROM article AS article RODER BY id LIMIT 1000000,10;
优化为:
SELECT * FROM article AS article WHERE id BETWEEN 1000000 AND 1000010 RODER BY id;
Between限定比limit快,所以海量数据访问时,建议between或是where替换掉limit。
但是between也有缺陷,如果id中间有断行或是中间部分id不读取的情况,总读取的数量会少于预计数量!
在取比较后面的数据时,通过desc方式把数据反向查找,以减少对前段数据的扫描,让limit 的基数越小越好!
原则7:不要使用rand()函数获取多条随机记录。
例如:
select * from table order by rand() limit 20;
使用下面的语句代替:
Select * from ‘table’as t1 join(select rand(rand() * ((select max(id) from ‘table’)-(select min(id) from ‘table’))+(select min(id) from ‘table’))as id) as t2 where t1.id >= t2.id order by t1.id limit 1;
这是获取一条随机记录,这样即使执行20次,也比原来的语句高效。
或者先用php产生随机数,把这个字符串传给MySQL,MySQL里用in查询。
原则8:避免使用null。
原则9:不要使用count(id),而应该是count(*)。
原则10:不要做无谓的排序操作,而尽可能在索引中完成排序。