SQL优化小讲堂(五)——索引的那些事

简介: 提到索引,想必小伙伴们都知道,它是为了提高查询效率而生。但是在查询过程中,怎么才能让我们的查询语句使用索引?相必大家或多或少都会遇到这样的问题。今天我们就来回答这个问题。

1. 聚集索引和非聚集索引


索引一般分为聚集索引和非聚集索引。

聚集索引速度很快,但只能建一个,所以尽量把经常使用的列建成聚集索引。

非聚集索引虽然没聚集索引快,但是可以建多个,比全表扫描快。


2 如何建立高效的索引


A.关联条件上建立索引

例如:

SELECT  * FROM  T1

JOIN  T2 ON  T1.ORDER_ID=T2.ORDER_ID;

在关联条件ON后面的两个列就可以分别建立索引,这样会很快将符合关联条件的数据查询出来。

B.在条件查询上建立索引

例如:

SELECT * FROM T1

WHERE  T1.PRICE>20;

在WHERE条件PRICE列上就可以建立索引。

注意:以下几种情况不会使用索引

  • 在索引列上使用了运算符的,
    例如:T1.PRICE*0.5>20,这种不会使用索引
  • 在索引列上使用了函数的,
    例如:UPPER(T1.ADDRESS)='NEWYORK',也不会使用索引
  • 在使用索引时存在空值NULL的,
    例如:T1.ADDRESS IS NULL,那么在查询时就不会走索引了
  • 字符型数据不加引号也不会使用索引
    例如:ORDER_ID原本是字符型,T1.ORDER_ID='112'会使用索引,但是如果去掉引号,变成了T1.ORDER_ID=112,查询语句不会报错,但是不会使用索引了。
  • 或(OR)和不等(<>,!=)以及NOT IN等这些也不会使用索引
  • 经常使用的LIKE,除了后置匹配,其他匹配均不走索引
    例如:T1.ADDRESS LIKE ‘NEW%’,这个走索引,但是像
    T1.ADDRESS LIKE ‘%NEW%’和T1.ADDRESS LIKE ‘%NEW’则均不走索引了
  • 最后如果查询优化器判断全表扫描比走索引还快也不会使用到索引。

C.建立索引的原则

  • 不频繁写入和更新的列适合建立索引
  • 经常查询的列适合建立索引
  • 重复数据较少的可以建立索引

D.联合索引的妙用

联合索引就是几个列合在一起组成一个索引,这种在WHERE条件中相比单列索引会起到意想不到效果。

例如:

SELECT * FROM T1 WHERE T1.CITY=‘北京’ AND T1.DISTR='海淀区';

这个时候将列CITY和DISTR建立成一个联合索引,效果会更好。

注意:联合索引需要按顺序走,如果中间某个索引不能使用,那它之后的列均不会使用索引。

例如:

SELECT * FROM T1

WHERE T1.CITY=‘北京’

AND LEFT(T1.DISTR,3)='海淀区'

AND T1.ROAD='#10'

如果我们将CITY,DISTR,ROAD建立成为联合索引,由于索引的前置规则,只会让CITY走索引,后面的DISTR因为使用了函数,索引失效,最后的ROAD列因为DISTR的失效也会跟着失效,这里记住即可。


3什么情况不适合建立索引


由于创建索引和维护索引耗时,时间随着数据的增加而增加,成正比;需要占物理空间;当对表中的数据进行维护时,对索引也要进行维护,这样就降低了数据的维护速度。基于这些缺点,以下情况不适合建立索引

  • 对于在查询过程中很少使用或参考的列,不应该创建索引。
  • 对于那些只有很少数据值的列,不应该创建索引,例如:性别。
  • 对于那些定义为image,text和bit数据类型的列,不应该创建索引。
  • 当修改性能远大于检索性能,不应该建立索引。
  • 重复值较多的也不适合建立索引。
相关文章
|
22天前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
1月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
2月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
100 11
|
1月前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
|
3月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
3月前
|
SQL 缓存 数据库
SQL慢查询优化策略
在数据库管理和应用开发中,SQL查询的性能优化至关重要。慢查询优化不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将详细介绍针对SQL慢查询的优化策略。
|
3月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
3月前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
3月前
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
247 3
|
3月前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
264 10

热门文章

最新文章