索引的存储分类;mysql目前提供了以下4种索引

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

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

【3】R-Tree索引(空间索引):空间索引是myIsam的一个特殊索引类型,主要用于地理空间数据类型。

【4】FULL-TEXT(全文索引):全文索引也是MyISAM的一个特殊索引类型。InnoDB从Mysql5.6版本开始也提供全文索引的支持。

  注意,mysql目前不支持函数索引,但是能支持前缀索引(即取字段的前N个字符来做索引)。

  

0、快速了解索引系列

0.1、索引系列思维导图

  

0.2、数据页的组成

MySQL的基本存储结构是页(记录都存在页里边):

  

  

  • 各个数据页可以组成一个双向链表
  • 每个数据页中的记录又可以组成一个单向链表
    • 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录
    • 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。

所以说,如果我们写select * from user where indexname = 'xxx'这样没有进行任何优化的sql语句,默认会这样做:

  1. 定位到记录所在的页:需要遍历双向链表,找到所在的页
  2. 从所在的页内中查找相应的记录:由于不是根据主键查询,只能遍历所在页的单链表了

很明显,在数据量很大的情况下这样查找会很慢!这样的时间复杂度为O(n)。

0.3、B树索引的组织方式

索引做了些什么可以让我们查询加快速度呢?其实就是将无序的数据变成有序(相对):

0.4、B树索引的检索方式

要找到id为8的记录简要步骤:

很明显的是:没有用索引我们是需要遍历双向链表来定位对应的页,现在通过 “目录” 就可以很快地定位到对应的页上了!(二分查找,时间复杂度近似为O(logn))

其实底层结构就是B+树,B+树作为树的一种实现,能够让我们很快地查找出对应的记录。

1、索引概述

【1.1】mysql每个表至少可以支持16个索引

【1.2】myISAM和InnoDB存储引擎的表默认创建的都是BTREE索引。

【1.3】mysql不支持函数索引,但支持前缀索引(myISAM支持1000字节长,InnoDB支持767字节长)

【1.4】mysql支持全文索引(fullText),但是只有myISAM存储引擎支持,5.7及之后InnoDB也支持

【1.5】mysql的memory存储引擎支持hash和btree

2、基本形式

-- 2.1 直接创建模式
CREATE [unique | fulltext | spatial] INDEX index_name
[USING index_type]
ON table_name(index_col_name) (1)index_col_name:col_name[ (length) ] [ASC|DESC]
(2)index_type: USING{BTREE | HASH} 举例:create index ix_cityName on city(city_name(10)); -- 2.2 使用alter table 增加索引
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE table_name
[ADD|DROP] [INDEX | KEY] index_name [index_type](index_col_name...) [index_option] (1)index_col_name:col_name[ (length) ] [ASC|DESC]
(2)index_type: USING{BTREE | HASH} 举例:alter table city add index ix_cityName using btree(city_name(10) ASC)

3、索引的设计原则

【3.1】搜索的索引列,即where中常用的

【3.2】使用唯一索引,索引重复值越少,索引效果越好

【3.3】使用短索引,索引越短占用空间越少,扫描速度越快

【3.4】利用左前缀(复合索引),只有最左边那个列最高效

【3.5】不要过度索引,一般不超过5个

【3.6】InnoDB存储引擎的表,默认会按一定顺序保存,如果有主键就按主键顺序保存,如果没有主键有唯一索引就按唯一索引顺序保存,如果都没有则表中会自动生成一个内部列,按照这个列的顺序保存。

4、mysql中能够使用索引的经典场景

【4.1】匹配全值:对索引中的所有列都指定具体值

【4.2】匹配值的范围查询:对索引的值能够进行范围查找

【4.3】复合索引(多列组成的索引):仅仅使用索引中最左边的列进行查找

【4.4】仅对索引字段进行查询(index only query):当查询的列(即select column...from tab)都在索引字段时,查询效率更改(如MSSQL中的覆盖索引)

【4.5】匹配列前缀(Match a column prefix):当有前缀索引时,仅仅使用索引的第一列,并且只包含索引第一列的开头一部分进行查找。

【4.6】column is null:如果列是索引列,则使用column is null也会走索引(这和Oracle和MSSQL均不同)

5、mysql中不能使用B-tree索引的经典场景

【5.1】以%开头的like查询:原因是B-TREE索引结构原理,这种一般可以用全文索引

【5.2】数据类型出现隐式转换:因为转换后类型与索引不一置,索引无法使用

【5.3】复合索引除最左列:符合索引多列时,只有最左列能用到索引

【5.4】CBO基于代价:如果mysql估计使用索引比全表扫描更慢,就会使用全表扫(一般是因为返回的结果集记录太多)

【5.5】用or 分隔开的条件:如果or前的列有索引,而后面的列没有索引,那么设计的索引都不会被用到。因为or后面的条件列中没有索引,那么后面的查询肯定要全表扫了,存在全表扫的情况下,就没有必要多一次索引扫描增加I/O访问了。如果前后均有索引(那就和in一样了),那么就可以走索引。

深入参考:https://www.cnblogs.com/liqiangchn/p/12432236.html

(1.2)mysql 索引概念的更多相关文章

  1. Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别

    Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要 ...

  2. 来了解一下Mysql索引的相关知识:基础概念、性能影响、索引类型、创建原则、注意事项

    索引的基础概念索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录,定位对应的页码:存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行 ...

  3. 【详细解析】MySQL索引详解( 索引概念、6大索引类型、key 和 index 的区别、其他索引方式)

    [详细解析]MySQL索引详解( 索引概念.6大索引类型.key 和 index 的区别.其他索引方式) MySQL索引的概念: 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分 ...

  4. MySQL事务概念与流程和索引控制

    MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...

  5. MySQL索引的概念

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 索引分为聚簇索 ...

  6. 深入MySQL索引

    MySQL索引作为数据库优化的常用手段之一在项目优化中经常会被用到, 但是如何建立高效索引,有效的使用索引以及索引优化的背后到底是什么原理?这次我们深入数据库索引,从索引的数据结构开始说起. 索引原理 ...

  7. MySql索引总结

    索引概念 B+树索引分为聚集索引和非聚集索引(辅助索引),但是两者的数据结构都和B+树一样,区别是存放的内容. 可以说数据库必须有索引,没有索引则检索过程变成了顺序查找,O(n)的时间复杂度几乎是不能 ...

  8. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  9. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

随机推荐

  1. Python进阶 学习笔记(一)

    (笔记范围:第一章 课程介绍:第二章 函数式编程:第三章 模块) Python支持的函数式编程 不是纯函数式编程:允许有变量 支持高阶函数:函数也可以作为变量传入 支持闭包:有了闭包就能返回函数 有限 ...

  2. c++学习笔记—二叉树基本操作的实现

    用c++语言实现的二叉树基本操作,包括二叉树的创建.二叉树的遍历(包括前序.中序.后序递归和非递归算法).求二叉树高度,计数叶子节点数.计数度为1的节点数等基本操作. IDE:vs2013 具体实现代 ...

  3. document.visibilityState 监听浏览器最小化

    document.hidden:表示页面是否隐藏的布尔值.页面隐藏包括 页面在后台标签页中 或者 浏览器最小化 (注意,页面被其他软件遮盖并不算隐藏,比如打开的 sublime 遮住了浏览器). do ...

  4. jQuery的回调管理机制

    // 对option的一个缓存,避免每次都需要createOptions,option是创建Callback对象时的传入的参数// 每个option被存入optionsCache中类似于{memory ...

  5. python tkinter学习——布局

    目录 一.pack() 二.grid() 三.place() 四.Frame() 正文 布局 一.pack() pack()有以下几个常用属性: side padx pady ipadx ipady ...

  6. Ubuntu 最好用的CHM阅读器KchmViewer

    直接在“ubuntu软件中心”进行搜索安装 为什么说它是最好用?很简单!可同时显示目录和内容,中文没乱码!能实现这两点的竞争对手已经不多了,至少我是没发现.什么chmsee,gnochm,都有乱码.虽 ...

  7. [PHP] Compile an extension on Windows

    https://wiki.php.net/internals/windows/stepbystepbuildhttp://blog.benoitblanchon.fr/build-php-extens ...

  8. js ==和===以及!= 和 !==的区别

    一.js == 与 === 的区别[转] 1. 对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型 ...

  9. 题目1013:开门人和关门人(结构体自定义cmp排序)

    题目链接:http://ac.jobdu.com/problem.php?pid=1013 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  10. (TOJ 4413)IP address

    描述 To give you an IP address, it may be dotted decimal IP address, it may be 32-bit binary IP addres ...