mysql索引工作原理、分类
一、概述
在mysql中,索引(index)又叫键(key),它是存储引擎用于快速找到所需记录的一种数据结构。在越来越大的表中,索引是对查询性能优化最有效的手段,索引对性能影响非常关键。另外,mysql的索引是在存储引擎层实现,而不是在服务器层。
二、索引的工作原理
我们知道,在看一本书某章的时候,首先我们会查找目录索引,找到对应的页码然后快速找到相应的内容。mysql索引也一样,存储引擎利用类似的方法使用索引,先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行,然后返回结果。
例如,我们想在一个10W条记录表 table 中查询name等于“张三”的数据行,select * from table where name ='张三'。那么在没有对name字段建立索引的情况下,我们需要扫描全表也就是扫描10W条数据来找到这条数据;如果我们为name字段建立索引,我们只需要查找索引,然后根据索引找到对应的数据行,只需要查找一条记录,性能会得到很大的提高。
三、索引分类
索引按照实现方式不同可以分为 B-Tree索引、hash索引、空间数据索引以及全文索引等。如果没有特别指明,多半用的是B-Tree索引,B-Tree 对索引列是顺序存储的,因此很适合查找范围数据。它能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据。
四、索引类型
索引主要分为:单列索引(普通索引、主键索引、唯一索引)和组合索引。
普通索引:
CREATE INDEX name_Index ON `table`(`name`);
1
|
ALTER TABLE table ADD INDEX name_Index(` name `) |
唯一索引:
1
|
CREATE UNIQUE INDEX id_UNIQUE_Index ON ` table `(`id`); |
主键索引:主键索引和唯一索引类似,唯一索引允许有空值,而主键索引不允许。
组合索引:通俗的说,组合索引就是一个表中一个索引包括多个字段,一个表中多个单列索引并不是组合索引。
例如:
1
|
CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`); |
五、组合索引的查询规则(什么情况下有效,什么情况下无效)
B-Tree 索引适用于全键值、键值范围或键前缀查找,其中键前缀查找只适用于根据最左前缀查找。我们建立表user(id,last_name,first_name, age ,birthday,sex),建立组合索引 key(last_name, first_name, birthday),那么它实际上包括三个索引(last_name),(last_name,first_name),(last_name,first_name,birthday)。
下面我们来分析组合索引有效以及无效的情况,mysql在使用组合索引查询的时候需要遵循“最左前缀”规则,什么是“最左前缀”规则呢,就是在使用组合索引查询,where的条件要按照从左到右的顺序,last_name first_name birthday,可以是只有last_name,或者包括last_name、first_name,或者last_name、first_name、birthday,这个从左到右的顺序不能变,也不能跳过;如果是直接first_name='ruby' 组合索引不生效,或者跳过first_name,last_name=‘allon’ and birthday = ‘2012’,组合索引只有last_name生效,后面的所有不生效。
例如:1、全键值匹配:select * from user where last_name=‘allon’ and first_name='java' and birthday=‘2017-12'是生效的,如果 select * from user where first_name='java' and birthday=‘2017-12'组合索引是不生效的,因为没有key(first_name,birthday)的索引。
2、键前缀查找:select * from user where last_name=‘allon’;这个索引存在,也是有效的,但不能select * from user where first_name='java',这样不生效。
3、like模糊查询:比如只匹配组合索引第一列的值的开头部分,查询last_name姓张的人,select * from user where last_name like ‘张%’;但是不能select * from user where last_name like ‘%张’;组合索引也无法查找以张结尾的人。 再如 select * from user where last_name='allon' and first_name like '三%' and birthday = '2012-11-06',因为first_name用了like这个范围查询条件,那么查询只用到了组合索引的前两列,范围查询右面的列birthday无法用索引优化查询。
如果查询中有某个列的范围查询,则该列右边的所有列都无法使用索引优化查找
4、匹配范围值:select * from user where last_name between ’allon‘ and 'clitton';这里只使用了组合索引的第一列,是生效的。
六、索引的优缺点
优点:1、建立索引后,在查询的时候合理利用索引能够提高数据库性能;
2、主键索引 唯一索引能保证表中每一条数据的唯一性
3、减少分组和排序的时间
4、在表连接的连接条件上使用索引,可以加速表与表之间的相连。
缺点:1、创建索引和维护索引需要时间消耗;
2、索引文件占用物理空间
3、当对表的数据进行insert update delete时候需要维护索引,会降低数据的维护数据。
mysql索引工作原理、分类的更多相关文章
- MySQL:索引工作原理
索引查找:通过索引键找到索引的叶子节点,再通过叶子节点的标记快速找到表中对应的行数据,再返回指定的列 索引找查是通过索引键定先位到一块局部区域,再开始扫描匹配的数据的. 为什么需要索引(Why is ...
- MySQL索引工作原理
为什么需要索引(Why is it needed)?当数据保存在磁盘类存储介质上时,它是作为数据块存放.这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性.硬盘数据块存储结构类似于链表,都包 ...
- MySQL/MariaDB数据库的索引工作原理和优化
MySQL/MariaDB数据库的索引工作原理和优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际工作中索引这个技术是影响服务器性能一个非常重要的指标,因此我们得花时间去了 ...
- 重新学习MySQL数据库4:Mysql索引实现原理
重新学习Mysql数据库4:Mysql索引实现原理 MySQL索引类型 (https://www.cnblogs.com/luyucheng/p/6289714.html) 一.简介 MySQL目前主 ...
- MySQL索引的原理,B+树、聚集索引和二级索引
MySQL索引的原理,B+树.聚集索引和二级索引的结构分析 一.索引类型 1.1 B树 1.2 B+树 1.3 哈希索引 1.4 聚集索引(clusterd index) 1.5 二级索引(secon ...
- MYSQL索引结构原理、性能分析与优化
[转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...
- Ceph对象存储网关中的索引工作原理<转>
Ceph 对象存储网关允许你通过 Swift 及 S3 API 访问 Ceph .它将这些 API 请求转化为 librados 请求.Librados 是一个非常出色的对象存储(库)但是它无法高效的 ...
- 【转】由浅入深探究mysql索引结构原理、性能分析与优化
摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...
- MySQL-索引工作原理及使用注意事项
1.为什么需要索引(Why is it needed)? 当数据保存在磁盘类存储介质上时,它是作为数据块存放.这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性.硬盘数据块存储结构类似于链表 ...
随机推荐
- 腾讯之困,QQ与微信各有各的烦恼
QQ渐渐在腾讯内部弱化 在PC时代,QQ是即时通讯领域当之无愧的王者.但在微信崛起后,手机QQ未来会被微信替代的判断喧嚣至上. 早在2012年就有传言腾讯在游戏领域開始去"娱乐化" ...
- vim 插件之supertab
supertab.vim 这个插件是用来把tab键作为只能补全的映射,当然,具体更能肯定不仅仅只是如此,等待以后发现吧 地址 http://github.com/ervandew/supertab h ...
- Linux-php7安装redis
Linux-php7安装redis 标签(空格分隔): 未分类 安装redis服务 1 下载redis cd /usr/local/ 进入安装目录 wget http://download.redis ...
- 范型在java中的应用
根据泛型在java中的不同位置,大致可以分为类泛型.方法泛型和接口泛型.以下三个Demo基本展现三种泛型的用法,其中接口泛型又分两种情况描述.类泛型和方法泛型 import java.util.Arr ...
- html5开发页游(前话)
导师要求模仿某个页游网站开发益智小游戏.老板的要求是要跨平台,IOS,Android.PC.Mac等系统主要通过浏览器打开都能用.那个网站的页游是通过flash实现的,使用这种方法肯定不能满足老板的要 ...
- vue组件父子之间相互通信案例
- Xor Sum 2(位运算)
D - Xor Sum 2 Time limit : 2sec / Memory limit : 1024MB Score : 500 points Problem Statement There i ...
- caffe模型各层数据和参数可视化
先用caffe对cifar10进行训练,将训练的结果模型进行保存,得到一个caffemodel,然后从测试图片中选出一张进行测试,并进行可视化. In [1]: #加载必要的库 import nump ...
- Rman备份异机恢复
最后更新时间:2018/12/29 前置条件 已准备一台安装好Centos6+oracle11gr2 软件的服务器; 只安装了 oracle 数据库软件,需要手工创建以下目录: #环境变量 expor ...
- webStrom的破解以及汉化
破解方法: 把JetbrainsCrack-3.1-release-enc.jar包放到bin目录下,然后把webstorm64.exe.vmoptions文件用文本打开, 在最后面加上一句-java ...