客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连、超时,严重影响业务的正常运行。因此,称低效的SQL语句为客服业务的‘恶龙’并不过分。数据库的优化方法有很多种,在应用层来说,主要是基于索引的优化。本次秘笈根据实际的工作经验,在研发原来已有的方法的基础上,进行了一些扩充,总结了基于索引的SQL语句优化的降龙十八掌,希望有一天你能用其中一掌来驯服客服业务中横行的‘恶龙’。 这次传授的降龙十八掌,总纲只有一句话:建立必要的索引,这就是后面降龙十八掌的内功基础。这一点看似容易实际却很难。难就难在如何判断哪些索引是必要的,哪些又是不必要的。判断的最终标准是看这些索引是否对我们的数据库性能有所帮助。具体到方法上,就必须熟悉数据库应用程序中的所有SQL语句,从中统计出常用的可能对性能有影响的部分SQL,分析、归纳出作为Where条件子句的字段及其组合方式;在这一基础上可以初步判断出哪些表的哪些字段应该建立索引。其次,必须熟悉应用程序。必须了解哪些表是数据操作频繁的表;哪些表经常与其他表进行连接;哪些表中的数据量可能很大;对于数据量大的表,其中各个字段的数据分布情况如何;等等。对于满足以上条件的这些表,必须重点关注,因为在这些表上的索引,将对SQL语句的性能产生举足轻重的影响。不过下面还是总结了一下降龙十八掌内功的入门基础,建立索引常用的规则如下: 1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5、索引应该建在选择性高的字段上; 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; 8、频繁进行数据操作的表,不要建立太多的索引; 9、删除无用的索引,避免对执行计划造成负面影响; 以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。 ### 基于索引的SQL语句优化之降龙十八掌 #### 1. 前言 在客服业务中,SQL语句的优化至关重要。一个小小的未优化的SQL语句可能会导致整个系统的性能急剧下降,从而影响用户体验。本文档旨在通过一系列具体的技巧——即“降龙十八掌”来帮助读者理解和掌握如何有效地使用索引来优化SQL语句。 #### 2. 总纲 降龙十八掌的核心理念是:“建立必要的索引”。这是所有后续技巧的基础。确定哪些索引是有用的并不简单,这需要对数据库应用程序中的所有SQL语句有一个全面的理解,并且能够识别出那些频繁使用的或对性能影响较大的SQL语句。此外,还需要对应用程序本身有足够的了解,比如知道哪些表的数据操作最为频繁、哪些表经常与其他表进行连接以及哪些表的数据量特别大等。 #### 3. 降龙十八掌 接下来,我们将详细介绍降龙十八掌的具体内容: **第一掌 避免对列的操作** - **解释**:对列进行操作(如使用数据库函数、计算表达式等)可能导致全表扫描,降低查询效率。 - **示例**: - `SELECT * FROM record WHERE SUBSTR(CardNo, 1, 4) = '5378'`:此查询效率低下,因为对`CardNo`列进行了字符串截取操作。 - `SELECT * FROM record WHERE amount / 30 < 1000`:类似的,除法运算降低了索引的使用效率。 - `SELECT * FROM record WHERE to_char(ActionTime, 'YYYYMMDD') = '19991201'`:日期格式化同样会影响索引的使用。 - **建议**:尽可能地将操作移到等式的右侧,甚至避免使用函数。 **第二掌 避免不必要的类型转换** - **解释**:类型转换可能导致索引无法被有效利用。 - **示例**: - `SELECT * FROM table WHERE column = 1.0`:若`column`为整型,这样的查询将导致类型转换,进而影响索引的使用。 - **建议**:确保查询中使用的值与列的类型相匹配。 **第三掌 增加查询的范围限制** - **解释**:通过添加适当的过滤条件来限制返回的结果集大小,从而提高查询效率。 - **示例**: - `SELECT * FROM table WHERE id > 100 AND id < 200`:这种限制比简单的`id > 100`更有效率。 - **建议**:尽量使用精确的过滤条件。 **第四掌 尽量去掉"IN"、"OR"** - **解释**:使用`IN`或`OR`操作符可能导致索引失效。 - **示例**: - `SELECT * FROM table WHERE id IN (1, 2, 3)`:尽量避免使用`IN`,改为多个`AND`条件。 - **建议**:尝试使用多个`AND`条件替代`IN`或`OR`。 **第五掌 尽量去掉"<>"** - **解释**:使用`<>`操作符可能导致索引无法被利用。 - **示例**: - `SELECT * FROM table WHERE id <> 1`:尽量避免使用`<>`,使用`!=`或`>`, `<`。 - **建议**:避免使用`<>`,改用其他逻辑操作符。 **第六掌 去掉Where子句中的ISNULL和ISNOTNULL** - **解释**:使用`IS NULL`或`IS NOT NULL`可能导致索引无法被有效利用。 - **示例**: - `SELECT * FROM table WHERE column IS NULL`:这种查询可能无法充分利用索引。 - **建议**:考虑使用`COALESCE(column, 'default_value')`或其他方法来替代。 **第七掌 索引提高数据分布不均匀时查询效率** - **解释**:当数据分布不均时,索引可能不能很好地发挥作用。 - **示例**: - `SELECT * FROM table WHERE column = 'A'`:如果`column`的值大部分为'B',那么索引可能不会得到充分利用。 - **建议**:对于数据分布不均匀的情况,可以考虑创建覆盖索引或调整数据分布。 **第八掌 利用HINT强制指定索引** - **解释**:在某些情况下,可以通过使用HINT来指导数据库使用特定的索引。 - **示例**: - `SELECT /*+ INDEX(table index_name) */ * FROM table WHERE column = 'value'`:此语法可用于强制使用某个索引。 - **建议**:谨慎使用HINT,仅在确实需要时使用。 **第九掌 屏蔽无用索引** - **解释**:删除不再使用的旧索引,以免对查询执行计划产生负面影响。 - **建议**:定期审查索引列表,并删除那些不再使用的索引。 **第十掌 分解复杂查询,用常量代替变量** - **解释**:复杂的查询结构可能导致索引使用不当。 - **示例**: - `SELECT * FROM table WHERE column = ?`:如果`?`代表动态值,索引可能无法有效利用。 - **建议**:尽可能使用常量值,或将查询分解成更简单的部分。 **第十一掌 like子句尽量前端匹配** - **解释**:使用`LIKE`时,如果模式匹配从字符串的开头开始,则更有可能利用索引。 - **示例**: - `SELECT * FROM table WHERE column LIKE 'prefix%'`:这种查询通常能更好地利用索引。 - **建议**:尽量让`LIKE`子句从前端开始匹配。 **第十二掌 用Case语句合并多重扫描** - **解释**:使用`CASE`语句可以帮助合并多个查询为单一查询。 - **示例**: - 使用`CASE`语句代替多个`UNION ALL`查询。 - **建议**:使用`CASE`语句可以减少数据扫描次数。 **第十三掌 使用nls_date_format** - **解释**:使用`NLS_DATE_FORMAT`设置可以改善日期处理。 - **建议**:确保所有涉及日期的查询都使用一致的格式。 **第十四掌 使用基于函数的索引** - **解释**:基于函数的索引可以支持查询中的函数调用。 - **示例**: - 创建基于函数的索引,如`CREATE INDEX idx ON table(to_upper(column))`。 - **建议**:对于频繁使用的函数操作,考虑创建基于函数的索引。 **第十五掌 基于函数的索引要求等式匹配** - **解释**:基于函数的索引在等式匹配时最有效。 - **示例**: - `SELECT * FROM table WHERE to_upper(column) = 'VALUE'`:这种查询能很好地利用基于函数的索引。 - **建议**:尽量使用等式匹配。 **第十六掌 使用分区索引** - **解释**:分区索引可以提高对大数据表的查询效率。 - **建议**:对于大型数据表,考虑使用分区索引。 **第十七掌 使用位图索引** - **解释**:位图索引适用于具有少量不同值的列。 - **建议**:对于具有有限不同值的列,使用位图索引可以显著提高查询效率。 **第十八掌 决定使用全表扫描还是使用索引** - **解释**:有时全表扫描比使用索引更高效。 - **建议**:评估每个查询的最佳策略,考虑数据量、索引结构等因素。 #### 4. 总结 通过对以上降龙十八掌的学习和实践,我们可以更深入地理解如何使用索引来优化SQL语句。记住,每个数据库环境都是独一无二的,因此需要根据实际情况灵活应用这些技巧。通过持续的监控和调整,可以确保SQL语句的优化达到最佳效果,从而提高整体系统的性能和稳定性。
















剩余9页未读,继续阅读

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 0
- 资源: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于51单片机的五层电梯控制系统设计与实现:硬件配置、核心算法及Proteus仿真
- 基于JAVA的网络小说爬取与分析软件 -电子硬件课程设计资源
- HUST-CHSD-16位海明解码电路设计
- DataStructure-入栈和出栈的基本操作
- SentimentAnalysis-计算机二级c语言资料
- National-Computer-Rank-Examination-计算机二级资源
- 智能电网分布式模型预测控制博弈论方法的MATLAB实现及应用
- HUST-CHSD-16位海明解码电路设计
- 每周精选合集-活动资源
- uengine 运行器-android
- 前端资料库-软考-网络工程师资源
- HUST-CHSD-16位海明解码电路设计
- Abaqus中轮胎仿真的关键技术:2D网格映射3D模型、充气模拟及稳态滚动分析
- jeewx-boot-活动资源
- theWayToGolang-计算机二级c语言资料
- 威纶通MT6103IP触摸屏与台达DTA4848温控器Modbus RTU通讯配置及调试指南


