mysql5.6 函数索引_聊聊MySQL中的索引
关于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中的索引相关推荐
- mysql pt工具 加索引_[转]MySQL中如何为连接添加索引
SELECT * FROM tblA, tblB, tblC WHERE tblA.col1 = tblB.col1 AND tblA.col2 = tblC.col1; explain的结果如下: ...
- 在mysql中如何为连接添加索引_在MySQL中如何为连接添加索引
http://hackmysql.com/case4 译文: 我先通过一个简单的例子说明在MySQL中如何为连接添加索引,然后再看一个有挑战性的例子. 简单的3个表的连接 表结构很简单,3个表tblA ...
- 数据库mysql建立索引_为mysql数据库建立索引
前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...
- mysql查询是否走索引_探索MySQL是否走索引(一)——范围查询一定走索引吗?
首先,准备4个版本的数据库,5.5/5.6/5.7/8.0 然后,每个库中有一模一样的表,数据量一样,建立的索引一样,InnoDB引擎. 先看一看,各个版本中,索引统计信息(Cardinality代表 ...
- mysql判断是否建立索引_判断mysql中列是否要添加索引的标准
最近再看mysql技术内部+innoDb存储引擎一书,书中第五章-索引与算法中讲到 查看表的索引信息中的一些参数含义,特作记录 show index from table_name ## 查看该表的 ...
- mysql 临时表建索引_使用select中的索引在MySQL中创建一个临时表
我用CREATE TEMPORARY TABLE SELECT的正确语法摔了一会儿.想出了一些事情,我想与社区的其他人分享答案. 有关该语句的基本信息可以在以下MySQL链接中找到: 有时候,解释规范 ...
- mysql子查询为什么不走索引_解决MySQL中IN子查询会导致无法使用索引问题
测试表如下: CREATE TABLE`test_table` ( `id`int(11) NOT NULLAUTO_INCREMENT, `pay_id`int(11) DEFAULT NULL, ...
- python删除列索引_从datafram中删除列索引
我通过传递cordinate从excel表中提取了多个数据帧(start&end) 现在我用下面的函数来表示cordinates,但是当我试图 将其转换为dataframe,不确定索引在df中 ...
- 覆盖索引与联合索引_浅析MySQL的索引覆盖和索引下推
写在前面 在MySQL数据库中,索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点,索引就是为了提高数据查询的效率.今天我们来聊聊在MySQL索引优化中两种常见的方式,索引覆盖和 ...
最新文章
- 是时候对XSLT说“Goodbye”了吗?
- 一台电脑上同启动两个Tomcat的方式,windows/Linux配置
- 2020-11-13(混淆技术)
- RHEL7.2系统下的软件管理(yum)、本地yum源和网络yum源的搭建
- Python进阶(5)_进程与线程之协程、I/O模型
- 闰秒导致MySQL服务器的CPU sys过高
- laravel-admin 在列表页添加自定义按钮
- VS code 连接Linux服务器
- endnotex8与9的区别_下载安装EndnoteX8或EndnoteX9,建立数据库并以自己的名字命名。...
- eclipse下载哪个版本开发java_官网上有很多版本的eclipse,下载哪个版本比较合适?...
- excel两个表格数据对比_常简单又实用的Excel数据对比技巧
- 网络安全专栏——telnet远程登录数据包捕获个性化登录账号及密码(图文丰富 保姆级 有几种错误解决方案 为什么不用输入telnet密码就能登录 )
- c语言中pinMode的作用,Arduino C语言的基本结构
- Python ADF检验
- cmd检查java_如何通过cmd查看java环境
- python音乐实例详解_python下载无损音乐示例源码(qq音乐)
- 好的提高代码质量的方法有哪些?
- Smart3D集群建模步骤
- 5 Mysql数据保护
- tikz 折线 箭头_TIKZ——LaTeX基本绘图
热门文章
- 傻瓜式图文教你在linux下搭建VNC服务器
- oracle linux 6.5 安装 virtualbox
- httpd启动报错:httpd: apr_sockaddr_info_get() failed for jsp...
- CentOS下yum源epel扩展源
- memcached+keepalived+magent高群集
- 5种云计算安全基础知识和最佳实践
- SD-WAN部署:全球企业必须考虑的问题—Vecloud微云
- 在桌面应用程序与Web应用程序之间该如何选择
- Qt vlc视频开发libvlc_new返回空的问题
- AMD Cpu 性能分析