【MySQL笔记】MySQL使用索引的场景及真正利用索引的SQL类型

本笔记主要记录MySQL索引方面的内容,以便为实际工作中SQL优化提供参考。

1. 为什么使用索引

在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关。对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否selective会导致这些字段建立的索引对查询速度的提升幅度不同,而且索引也并非越多越好,因为写入或删除时需要更新索引信息)。

对于MySQL的Innodb储存引擎来说,大部分类型的index均以B-Tree数据结构的变种B+Tree来存储(MEMORY类型的表还支持hash类型的索引)。B-Tree是数据库或文件系统中常用的一种数据结构,它是一种N叉平衡树,这种树结构保证了同层节点保存的key有序,对于某个节点来说,其左子树保存的所有key均小于该节点保存的key,其右子树保存的所有key均大于该节点保存的key。此外,在工程实现上,还结合操作系统的局部性原理做了很多优化,总之,b-tree的各种特性或优化技巧能保证:1)
查询磁盘记录时,读盘次数最少;2) 任何insert和delete操作对树结构的影响均很小;3) 树本身的rebalance操作很高效。

本文下面的内容主要介绍关于MySQL索引的常见场景,未对B-tree/B+Tree的数据结构做深入的原理性介绍,感兴趣的话,可参考wikipedia上的相关条目(B-treeB+
tree
),或者参考"MySQL索引背后的数据结构及算法原理"或"Understanding
B+tree Indexes and how they Impact Performance
"  这两篇文章,本笔记不再赘述。

2. MySQL使用索引的场景

MySQL在以下操作场景下会使用索引:

1) 快速查找符合where条件的记录

2) 快速确定候选集。若where条件使用了多个索引字段,则MySQL会优先使用能使候选记录集规模最小的那个索引,以便尽快淘汰不符合条件的记录。

3) 如果表中存在几个字段构成的联合索引,则查找记录时,这个联合索引的最左前缀匹配字段也会被自动作为索引来加速查找。

例如,若为某表创建了3个字段(c1, c2, c3)构成的联合索引,则(c1), (c1, c2), (c1, c2, c3)均会作为索引,(c2, c3)就不会被作为索引,而(c1,
c3)其实只利用到c1索引。

4) 多表做join操作时会使用索引(如果参与join的字段在这些表中均建立了索引的话)

5) 若某字段已建立索引,求该字段的min()或max()时,MySQL会使用索引

6) 对建立了索引的字段做sort或group操作时,MySQL会使用索引

3. 哪些SQL语句会真正利用索引

从MySQL官网文档"Comparison of B-Tree and Hash Indexes"可知,下面这些类型的SQL可能会真正用到索引:

1) B-Tree可被用于sql中对列做比较的表达式,如=, >, >=, <, <=及between操作

2) 若like语句的条件是不以通配符开头的常量串,MySQL也会使用索引

比如,SELECT * FROM tbl_name WHERE key_col LIKE ‘Patrick%‘或SELECT * FROM tbl_name WHERE key_col LIKE ‘Pat%_ck%‘可以利用索引,而SELECT * FROM tbl_name WHERE key_col LIKE ‘%Patrick%‘(以通配符开头)和SELECT * FROM tbl_name WHERE key_col LIKE other_col(like条件不是常量串)无法利用索引。

对于形如LIKE ‘%string%‘的sql语句,若通配符后面的string长度大于3,则MySQL会利用Turbo Boyer-Moore algorithm算法进行查找。

3) 若已对名为col_name的列建了索引,则形如"col_name is null"的SQL会用到索引

4) 对于联合索引,sql条件中的最左前缀匹配字段会用到索引,示例请参考本文第2节第3条对联合索引的说明

5) 若sql语句中的where条件不只1个条件,则MySQL会进行Index Merge优化来缩小候选集范围,具体的优化策略可以参考MySQL文档IndexMerge
Optimization

【参考资料】

1. MySQL索引背后的数据结构及算法原理

2. Understanding B+tree Indexes and how they Impact Performance

3. How MySQL Uses Indexes

4. Comparison of B-Tree and Hash Indexes

5. Index Merge Optimization

==================== EOF =================

时间: 2024-10-08 08:46:34

【MySQL笔记】MySQL使用索引的场景及真正利用索引的SQL类型的相关文章

MySQL使用索引的场景及真正利用索引的SQL类型

1. 为什么使用索引 在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关.对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否selective会导致这些字段建立的索引对查询速度的提升幅度不同,而且索引也并非越多越好,因为写入或删除时需要更新索引信息). 对于MySQL的Innodb储存引擎来说,大部分类型的index均以B-Tree数据结构的变种B+Tree来存储(MEMORY类型的表还支持hash类型的索引).B-Tree是

高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引

一.聚集索引介绍 1.什么是聚集索引? InnoDB’s clustered indexes actually store a B-Tree index and the rows together in the same structure. 2.为什么一张表只能一个聚集索引? When a table has a clustered index, its rows are actually stored in the index’s leaf pages.The term “clustered

涂抹mysql笔记-mysql复制特性

<>mysql复制特性:既可以实现整个服务(all databases)级别的复制,也可以只复制某个数据库或某个数据库中的某个指定的表对象.即可以实现A复制到B(主从单向复制),B再复制到C.也可以实现A直接复制到B和C(单主多从复制),甚至A的数据复制给B,B的数据也复制会A(双主复制) <>mysql复制处理数据时,有三种不同的模式: 1.基于语句复制(Statement Based Replication):基于实际执行的sql语句的模式方案简称SBR 2.基于记录复制(Ro

涂抹mysql笔记-mysql管理工具

五花八门的mysql管理工具<>mysql提供的命令行工具 mysql_install_db:mysql建库工具,在源码安装mysql环节我们使用过. mysql_safe:mysql启动工具 mysqld:mysql主进程,mysql_safe也是调用mysqld进程.启动关闭数据库.查询或修改数据.执行各项维护操作等实际上都是基于mysqld进程的操作. 系统参数:mysql服务启动时的参数 系统变量:mysql服务运行时参数.比如查看与log相关的系统变量使用show global va

mysql笔记6_索引

什么是索引? 数据库中的一个对象. 在数据库中用来加速表的查询. 通过使用快速路径访问方法定位数据,减少了磁盘的i/o. 与表分别独立存放,但不能独立存在,必须属于某个表. 由数据库自动维护,表被删除时,该表上的索引自动别删除. 索引的作用类似于书的目录,几乎没有一本书没有目录,因此几乎没有一张表没有索引. 怎样创建索引: create index 索引名 on 表名(字段名); 使用索引: where之后加上索引字段即可. 索引原理: 索引页 表 index_name|       loc  

Mysql 索引失效场景

例如:一张USER表   有字段属性 name,age   其中name为索引 下面列举几个索引失效的情况 1. select * from USER where name=‘xzz’ or age=16: 例如这种情况:当语句中带有or的时候 即使有索引也会失效. 2.select *  from  USER where name like‘%xzz’ : 例如这种情况:当语句索引 like 带%的时候索引失效(注意:如果上句为 like‘xzz’此时索引是生效的) 3.select * fr

MYSQL无法使用索引的场景

设计优化–无法使用索引的场景 ?通过索引扫描的记录数超过30%,变成全表扫描 ?联合索引中,第一个索引列使用范围查询--只能用到部分索引 ?联合索引中,第一个查询条件不是最左索引列 ?模糊查询条件列最左以通配符% 开始 ?内存表(HEAP 表)使用HASH索引时,使用范围检索或者ORDER BY ?两个独立索引,其中一个用于检索,一个用于排序--只能用到其中一个索引,5.6以上有ICP特性 ?表关联字段类型不一样(也包括长度不一样) ?索引字段条件上使用函数 ? 文章来源:刘俊涛的博客 地址:h

mysql笔记03 查询性能优化

查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行的更快. 2). 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中"执行"可以认为是整个生命周期中最重要的阶段,这其中包括 大量为了检索数据到存储引擎的调用以及调用后

【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)

原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_log分析 4分库分表 5子查询优化 二数据转移 21插入数据 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个时候NoSQL的出现暂时解决了这一危机.它通过降低数据的安全性,减少对事务