美文网首页
Sql索引优化—转载

Sql索引优化—转载

作者: 李九lijiu | 来源:发表于2020-06-20 12:55 被阅读0次

数据库索引使用方式

使用索引是提高数据库查询效率的主要方式,下面从索引结构,索引类型,索引操作,命中索引几个方面来介绍索引。

一、索引结构

mysql5.5以上的默认存储引擎innodb,只显式支持BTree( 事实上从数据结构上来讲是B+树,mysql称之为BTree)索引,对于频繁访问的表,innodb会建立自适应hash索引,

即在B树索引基础上建立hash索引,可以显著提高查找效率,用户是无法自己指定的,除此之外还有Hash索引和全文索引(fullText索引)。 

BTree索引 

BTree,顾名思义,就是所有的索引节点都按照balance tree的数据结构来存储。BTree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。

Btree中,每个结点包含:

1、本结点所含关键字的个数;

2、指向父结点的指针;

3、关键字;

4、指向子结点的指针;

更详细的B+树介绍参考https://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html

Hash索引 

Hash 索引由于使用了hash表结构,其检索效率很高,索引的检索可以一次定位,不像B+树索引需要从根节点到枝节点,

所以 Hash 索引的查询效率要远高于 B+树 索引。但是,Hash索引的使用范围非常有限。

    1.在MySQL中,只有HEAP/MEMORY引擎表才能支持哈希索引,InnoDB引擎的自适应哈希索引(adaptive hash index)不

   能在创建索引时指定。

   2.Hash索引仅支持=,>=,<=这几种条件运算,不支持排序,范围内查找,like等查询。

   3.Hash索引不支持组合索引中部分索引的查找。

   4.当Hash值重复较多时,索引速度可能不如BTree索引。

FullText索引

Full-text索引就是我们常说的全文索引,他的存储结构也是Btree。主要是为了解决在我们需要用like查询的低效问题。

只能解决’xxx%’的like查询。如:字段数据为ABCDE,索引建立为A、AB、ABC、ABCD、ABCDE五个。

二、索引类型

索引一般有:普通索引,唯一索引,复合索引这几种类型。

唯一索引:唯一索引要求字段中不会出现重复数据。

复合索引:将多个字段组合起来作为索引,必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。

三、索引操作

建立索引:

createindex索引名on表名(索引字段名)

建立唯一索引:

createuniqueindex索引名on表名(索引字段名)

建立复合索引:

createindex索引名on表名(索引字段名1,索引字段名2...)

查看表中索引:

showindexfrom表名

删除索引:

dropindex索引名on表名

查看索引是否命中

Mysql:当结果的type为 index时索引命中

explain+sql语句

Oracle:

explainplanfor+sql语句

四、命中索引

1.避免判断null值

应尽量避免在where子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

selectidfromtwherenumisnull

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

selectidfromtwherenum=0

2. 避免不等值判断

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

3.避免使用or逻辑

应尽量避免在where子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,

selectidfromtwherenum=1ornum=2

可以使用union all来进行查询来命中索引如:

selectidfromtwherenum=1 unionall selectidfromtwherenum=2

4 .慎用in和not in逻辑

in和 not in 也要慎用,否则会导致全表扫描,如:

selectidfromt1wherenumin(selectidfromt2whereid>10)

此时外层查询会全表扫描,不使用索引。可以修改为:

selectidfromt1,(selectidfromt1whereid>10)t2wheret1.id=t2.id

此时索引被使用,可以明显提升查询效率。

5.注意模糊查询

下面的查询也将导致全表扫描:

selectidfromtwherenamelike'%abc%'

不要在like条件左边加'%',这样不会走索引模糊查询如果是必要条件时,可以使用

selectidfromtwherenamelike'abc%'

来实现模糊查询,此时索引将被使用。如果头匹配是必要的,可以使用elasticsearch等全文搜索引擎。

6.避免查询条件中字段计算

应尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

selectidfromtwherenum/2=100

应改为:

selectidfromtwherenum=100*2

7.避免查询条件中对字段进行函数操作

应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

selectidfromtwheresubstring(name,1,3)='abc'

name以abc开头的id

应改为:

selectidfromtwherenamelike'abc%'

8. “=”左边避免表达式运算

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

9.组合索引使用

在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

10exists

很多时候用exists代替 in 是一个好的选择:

selectnumfromawherenumin(selectnumfromb)

用下面的语句替换:

selectnumfromawhereexists(select1frombwherenum=a.num)

相关文章

  • Sql索引优化—转载

    数据库索引使用方式 使用索引是提高数据库查询效率的主要方式,下面从索引结构,索引类型,索引操作,命中索引几个方面来...

  • sql优化的一般策略

    sql 优化的一般策略:索引优化,sql改写,参数优化,优化器 索引优化 以select * from vvsho...

  • SQL Server数据库高级进阶之索引优化实战演练

    一、SQL Server索引优化本质 二、SQL Server索引存储机制 三、SQL Server索引类型分类 ...

  • MySQl优化学习笔记(七)SQL优化简介

    一、SQL优化简介 1、我们平时说的SQL优化就是优化SQl语句和索引(通俗说就是使用什么样的SQL语句能够让索引...

  • Mysql索引

    提起优化 SQL,可能会把它理解为优化索引。简单来说这也不算错,索引在 SQL 优化中占了很大的比重。索引用得好,...

  • mysql数据库优化

    1. Mysql优化介绍 1.1 sql优化 a. sql优化分析b. 索引优化c. 常用sql优化d. 常用优化...

  • Mysql 优化提纲

    SQL & 索引 通过慢日志找到待优化的SQLs; explain 查询分析SQL执行计划; 索引优化; 数据库结...

  • 17.MySQL优化

    《高性能MySQL》——这本书都有的 “字段”优化总结 “索引”优化总结 索引的优化 “查询SQL”优化总结 “引...

  • Mysql 优化

    1.Sql优化 1)sql优化分析2)索引优化3)sql语句优化4)一些常用的技巧优化 (正则、函数) 2.优化数...

  • 数据库优化总结

    一、概述 二、优化方案详解 2.1、从数据库层面增强性能:优化SQL语句,合理使用字段索引,避免索引失效 SQL语...

网友评论

      本文标题:Sql索引优化—转载

      本文链接:https://www.haomeiwen.com/subject/wxiwxktx.html