关于MySQL中的索引使用

索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题。

索引的存储分类:

1、B-Tree索引:最常见的索引类型,大部分引擎都支持B树引擎

2、HASH索引:只有Memory引擎支持,使用场景简单

3、R-Tree索引(空间索引):MyISAM的一个特殊索引类型,主要用于地理看见数据类型,通常使用较少。

4、Full-text(全文索引):MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从MySQL5.6版本开始提供对全文索引的支持。

MySQL目前不支持函数索引,但是能对列的前面某一部分进行索引。这个特性可以大大缩小索引文件的大小,但前缀索引也有缺点,在排序Order By和分组Group By操作的时候无法使用。

create index idx_title on film(title(10));

MyISAM、InnoDB、Memory三个常见引擎支持的索引类型比较:

索引

MyISAM引擎

InnoDB引擎

Memory引擎

B-Tree索引

支持

支持

支持

HASH索引

不支持

不支持

支持

Full-text索引

支持

5.6版本开始支持

不支持

R-Tree索引

支持

不支持

不支持

比较常用到的索引就是B-Tree索引和Hash索引。Hash索引相对简单,只有Memory/Heap引擎支持Hash索引。Hash索引适用于Key-Value查询,通过Hash索引要比通过B-Tree索引查询更迅速;Hash索引不适用范围查询,例如、<=、>=这类操作。如果使用Memory/Heap引擎并且where条件中不使用“=”进行索引列,那么不会用到索引。Memory/Heap引擎只有在“=”的条件下才会使用索引。

B-Tree索引是最常见的索引,构造类似二叉树,能根据键值提供一行或者一个行集的快速访问,通常只需要很少的读操作就可以找到正确的行。不过,需要注意B-Tree索引中的B 不代表二叉树(binary),而是代表平衡树(balanced)。B-Tree索引并不是一棵二叉树。

MySQL中可以使用索引的常见场景:

1、匹配全值(match the all value),即where field = '**'

2、匹配值的范围(match the range),即where field (>=)

3、匹配最左前缀(Match a leftmost prefix) ,仅仅使用索引中的最左边列进行查找,比如在 col1 + col2 + col3 字段上的联合索引能够被包含 col1、(col1 + col2)、(col1 + col2 + col3)的等值查询利用到,可是不能够被 col2、(col2 + col3)的等值查询利用到。最左匹配原则可以算是MySQL中B-Tree索引使用的首要原则。

4、仅仅对索引进行查询(Index only query),当查询的列都在索引的字段中时,查询的效率更高

5、匹配列前缀(Match a column prefix),仅仅使用索引中的第一列,并且只包含索引第一列的开头一部分进行查找。

6、能够实现索引匹配部分精确而其他部分进行范围匹配(Match one part exactly and match a range on another part) 。

7、如果列名是索引,那么使用 column_name is null就会使用索引。

存在索引但是不能使用索引的常见场景:

1、以%开头的LIKE查询不能够利用B-Tree索引,执行计划中key的值为NULL表示没有使用索引。一般都推荐使用全文索引(Fulltext)来解决类似的全文检索问题。或者考虑利用 InnoDB 的表都是聚簇表的特点,采取一种轻量级别的解决方式:一般情况下,索引都会比表小,扫描索引要比扫描表更快(某些特殊情况下,索引比表更大,不在本例讨论范围内),而InnoDB表上二级索引idx_last_name实际上存储字段last_name还有主键actor_id,那么理想的访问方式应该是首先扫描二级索引 idx_last_name获得满足条件 last_name like '%NI%'的主键 actor_id列表,之后根据主键回表去检索记录,这样访问避开了全表扫描演员表actor产生的大量IO请求。

2、数据类型出现隐式转换的时候也不会使用索引,特别是当列类型是字符串,那么一定记得在 where 条件中把字符常量值用引号引起来,否则即便这个列上有索引,MySQL 也不会用到,因为MySQL默认把输入的常量值进行转换以后才进行检索。例如,演员表actor中的姓氏字段last_name是字符型的,但是SQL语句中的条件值1是一个数值型值,因此即便存在索引idx_last_name,MySQL也不能正确地用上索引,而是继续进行全表扫描。

3、复合索引的情况下,假如查询条件不包含索引列最左边部分,即不满足最左原则Leftmost,是不会使用复合索引的。

4、如果 MySQL 估计使用索引比全表扫描更慢,则不使用索引。

5、用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到

mysql5.6 函数索引_聊聊MySQL中的索引相关推荐

  1. mysql pt工具 加索引_[转]MySQL中如何为连接添加索引

    SELECT * FROM tblA, tblB, tblC WHERE tblA.col1 = tblB.col1 AND tblA.col2 = tblC.col1; explain的结果如下: ...

  2. 在mysql中如何为连接添加索引_在MySQL中如何为连接添加索引

    http://hackmysql.com/case4 译文: 我先通过一个简单的例子说明在MySQL中如何为连接添加索引,然后再看一个有挑战性的例子. 简单的3个表的连接 表结构很简单,3个表tblA ...

  3. 数据库mysql建立索引_为mysql数据库建立索引

    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...

  4. mysql查询是否走索引_探索MySQL是否走索引(一)——范围查询一定走索引吗?

    首先,准备4个版本的数据库,5.5/5.6/5.7/8.0 然后,每个库中有一模一样的表,数据量一样,建立的索引一样,InnoDB引擎. 先看一看,各个版本中,索引统计信息(Cardinality代表 ...

  5. mysql判断是否建立索引_判断mysql中列是否要添加索引的标准

    最近再看mysql技术内部+innoDb存储引擎一书,书中第五章-索引与算法中讲到 查看表的索引信息中的一些参数含义,特作记录 show index from table_name ##  查看该表的 ...

  6. mysql 临时表建索引_使用select中的索引在MySQL中创建一个临时表

    我用CREATE TEMPORARY TABLE SELECT的正确语法摔了一会儿.想出了一些事情,我想与社区的其他人分享答案. 有关该语句的基本信息可以在以下MySQL链接中找到: 有时候,解释规范 ...

  7. mysql子查询为什么不走索引_解决MySQL中IN子查询会导致无法使用索引问题

    测试表如下: CREATE TABLE`test_table` ( `id`int(11) NOT NULLAUTO_INCREMENT, `pay_id`int(11) DEFAULT NULL, ...

  8. python删除列索引_从datafram中删除列索引

    我通过传递cordinate从excel表中提取了多个数据帧(start&end) 现在我用下面的函数来表示cordinates,但是当我试图 将其转换为dataframe,不确定索引在df中 ...

  9. 覆盖索引与联合索引_浅析MySQL的索引覆盖和索引下推

    写在前面 在MySQL数据库中,索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率.今天我们来聊聊在MySQL索引优化中两种常见的方式,索引覆盖和 ...

最新文章

  1. 是时候对XSLT说“Goodbye”了吗?
  2. 一台电脑上同启动两个Tomcat的方式,windows/Linux配置
  3. 2020-11-13(混淆技术)
  4. RHEL7.2系统下的软件管理(yum)、本地yum源和网络yum源的搭建
  5. Python进阶(5)_进程与线程之协程、I/O模型
  6. 闰秒导致MySQL服务器的CPU sys过高
  7. laravel-admin 在列表页添加自定义按钮
  8. VS code 连接Linux服务器
  9. endnotex8与9的区别_下载安装EndnoteX8或EndnoteX9,建立数据库并以自己的名字命名。...
  10. eclipse下载哪个版本开发java_官网上有很多版本的eclipse,下载哪个版本比较合适?...
  11. excel两个表格数据对比_常简单又实用的Excel数据对比技巧
  12. 网络安全专栏——telnet远程登录数据包捕获个性化登录账号及密码(图文丰富 保姆级 有几种错误解决方案 为什么不用输入telnet密码就能登录 )
  13. c语言中pinMode的作用,Arduino C语言的基本结构
  14. Python ADF检验
  15. cmd检查java_如何通过cmd查看java环境
  16. python音乐实例详解_python下载无损音乐示例源码(qq音乐)
  17. 好的提高代码质量的方法有哪些?
  18. Smart3D集群建模步骤
  19. 5 Mysql数据保护
  20. tikz 折线 箭头_TIKZ——LaTeX基本绘图

热门文章

  1. 傻瓜式图文教你在linux下搭建VNC服务器
  2. oracle linux 6.5 安装 virtualbox
  3. httpd启动报错:httpd: apr_sockaddr_info_get() failed for jsp...
  4. CentOS下yum源epel扩展源
  5. memcached+keepalived+magent高群集
  6. 5种云计算安全基础知识和最佳实践
  7. SD-WAN部署:全球企业必须考虑的问题—Vecloud微云
  8. 在桌面应用程序与Web应用程序之间该如何选择
  9. Qt vlc视频开发libvlc_new返回空的问题
  10. AMD Cpu 性能分析