1. 普通索引:最基本的索引,它没有任何限制,用于加速查询。

2. 唯一索引unique:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

3. 主键索引: 是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。

4. 空间索引Spatial:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建

5. 全文索引fulltext: 主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。

Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。

(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。

由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

(2)Hash 索引无法被用来避免数据的排序操作。

由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;

(3)Hash 索引不能利用部分索引键查询。

对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

(4)Hash 索引在任何时候都不能避免表扫描。

前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下

2. B-Tree索引

B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检 索中有非常优异的表现。        一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf Node ,而且到任何一个 Leaf Node 的最短路径的长度都是完全相同的,所以我们大家都称之为 B-Tree 索引当然,可能各种数据库(或 MySQL 的各种存储引擎)在存放自己的 B-Tree 索引的时候会对存储结构稍作改造。如 Innodb 存储引擎的 B-Tree 索引实际使用的存储结构实际上是 B+Tree ,也就是在 B-Tree 数据结构的基础上做了很小的改造,在每一个  Leaf Node 上面出了存放索引键的相关信息之外,还存储了指向与该 Leaf Node 相邻的后一个 LeafNode 的指针信息,这主要是为了加快检索多个相邻 Leaf Node 的效率考虑。        在 Innodb 存储引擎中,存在两种不同形式的索引,一种是 Cluster 形式的主键索引( Primary Key ),另外一种则是和其他存储引擎(如 MyISAM 存储引擎)存放形式基本相同的普通 B-Tree 索引,这种索引在 Innodb 存储引擎中被称为 Secondary Index 。下面我们通过图示来针对这两种索引的存放  形式做一个比较。

图示中左边为 Clustered 形式存放的 Primary Key ,右侧则为普通的 B-Tree 索引。两种 Root Node 和 Branch Nodes 方面都还是完全一样的。而 Leaf Nodes 就出现差异了。在 Prim中, Leaf Nodes 存放的是表的实际数据,不仅仅包括主键字段的数据,还包括其他字段的数据据以主键值有序的排列。而 Secondary Index 则和其他普通的 B-Tree 索引没有太大的差异,Leaf Nodes 出了存放索引键 的相关信息外,还存放了 Innodb 的主键值。

所以,在 Innodb 中如果通过主键来访问数据效率是非常高的,而如果是通过 Secondary Index 来访问数据的话, Innodb 首先通过 Secondary Index 的相关信息,通过相应的索引键检索到 Leaf Node之后,需要再通过 Leaf Node 中存放的主键值再通过主键索引来获取相应的数据行。MyISAM 存储引擎的主键索引和非主键索引差别很小,只不过是主键索引的索引键是一个唯一且非空 的键而已。而且 MyISAM 存储引擎的索引和 Innodb 的 Secondary Index 的存储结构也基本相同,主要的区别只是 MyISAM 存储引擎在 Leaf Nodes 上面出了存放索引键信息之外,再存放能直接定位到 MyISAM 数据文件中相应的数据行的信息(如 Row Number ),但并不会存放主键的键值信息

索引是数据库中用来提高性能的最常用工具。所有MySql列类型都可以被索引。索引用于快速找出在某个列中有一特定值的行。如果不使用索引,MYSQL必须从第一条记录开始然后读完整个表直到找出相关的行。常用的包括BTREE索引和HASH索引。

创建的语句:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type]

on tbl_nam(index_col_name,……)

1

2

3

1

2

3

删除索引语句:

DROP INDEX index_name ON tbl_name

1

2

1

2

设计索引的规则:

最适合索引的列是出现在where子句中的列,或连接子句中指定的列,而不是出现在select关键字后的选择列表中的列。

索引的列的基数越大,索引的效果越好。

尽量使用短索引。能够节省大量索引空间,也可能使查询更快。

不要过度索引。索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须进行更新,有时可能需要重构。

BTREE索引和HASH索引的比较

1、B-Tree索引

索引存储的值按索引列中的顺序排列。可以用B-Tree索引进行全关键字、关键字范围和关键字前缀查询。如果使用索引,必须保证按索引最左边前缀进行查询。由于B树中节点是顺序存储的,可以对查询结果进行order by。

限制:

1)查询必须从索引的最左边的列开始

2)不能跳过某一索引列。

3)存储引擎不能使用索引中范围条件右边的列。

例如,如果你的查询语句为WHERE last_name=”Smith” AND first_name LIKE ‘J%’ AND dob=’1976-12-23’,则该查询只会使用索引中的前两列,因为LIKE是范围查询。

2、Hash索引

MySQL中只有Memory存储引擎显示支持hash索引,是默认索引类型,它也支持B-Tree索引。

如果多个值有相同的hash code,索引把它们的行指针用链表保存到同一个hash表项中。

因为索引自己仅仅存储很短的值,所以索引非常紧凑,hash值不取决于列的数据类型,

int列的索引和长字符串列的索引一样大。

3、总结

HASH索引适合等式比较的操作,不能用来加速order by操作,也不能确定在两个值之间大约有多少行,会影响一些查询的执行效率。而且只能使用整个关键字来搜索一行。

BTREE索引,使用大于,小于,BETWEEN,不等于,LIKE等操作符的时候都可以用。对索引字段进行范围查询的时候,只有BTREE索引可以通过索引访问。HASH索引实际上是全表扫描的。

如果对多列进行索引,列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效查找。

假设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够

使用该索引。查询语句select * from t1 where c1=1也能够使用该索引。

但是,查询语句select * from t1 where c2=2不能够使用该索引,

因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。

索引是在存储引擎中实现的,不是在服务器层中实现的。所以,每种存储引擎的索引都不

一定完全相同,并不是所有的存储引擎都支持所有的索引类型。

高性能索引策略

1、聚簇索引

聚簇索引保证关键字的值相近的元组存储的物理位置也相同(所以字符串类型不宜建立聚簇索引,

特别是随机字符串,会使得系统进行大量的移动操作),且一个表只能有一个聚簇索引。

因为由存储引擎实现索引,所以,并不是所有的引擎都支持聚簇索引。

目前,只有solidDB和InnoDB支持。

2、覆盖索引

索引的使用

1)索引不会包含有null值得列

2)尽量使用短索引,对串列进行索引,如果可能应该指定一个前缀长度。短索引不仅可以提高查询速度而且可以节省磁盘空间和IO操作

3)like语句操作:like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

4)不要在列上进行运算

例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate

使用限制:

1)由于索引仅包含hash code和记录指针,所以,MySQL不能通过使用索引避免读取记录。但是访问内存中的记录是非常迅速的,不会对性能造成太大影响

2)不能使用hash索引排序。

3)Hash索引不支持键的部分匹配,因为是通过整个索引值来计算hash值的。

4)Hash索引只支持等值比较,例如使用=,IN( )和<=>。对于WHERE price>100并不能加速查询。

————————————————

版权声明:本文为CSDN博主「lovezhaohaimig」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/lovezhaohaimig/article/details/80303613

mysql索引4种结构_mysql索引:四种类型,两种方法相关推荐

  1. mysql system账户密码忘记了_MySQL数据库root账户密码忘记两种处理方法(保有效)...

    方法1: 1.停止MySQL服务 kill cat /var/run/mysqld/mysqld.pid 或者 pkill mysqld 2.创建一个密码赋值语句的文本文件 vi mysql-init ...

  2. php mysql索引最左原则_MySQL 索引使用策略及优化

    MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization). 本章讨论的高性能索引策略主要属于结构优化范畴.本章的内容完全基于上文的理 ...

  3. mysql数据库远程访问权限_MySQL数据库远程访问权限的两种打开办法

    在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户没有远程访问的权限. 下面介绍两种方法,解决这一问题. 1.改表法 可能是你 ...

  4. Mysql使用binlog恢复数据解决误操作问题的两种方法

    Mysql使用binlog恢复数据解决误操作问题的两种方法 参考文章: (1)Mysql使用binlog恢复数据解决误操作问题的两种方法 (2)https://www.cnblogs.com/Data ...

  5. mysql 增加字段位置靠前_mysql 字段指定值靠前排序方法,多字段排序排序方法

    背景:SEO下选择某查询条件 查询展示信息为装修设计师以及设计师作品.设计师原型设计为:选择某风格 例如:简约,则列表出现拥有简约风格的设计师信息以及该设计师类型为简约的作品(3条靠前记录) 浏览原型 ...

  6. 专升本英语——五种基本句型、六种从句、两种语态、九种时态、三单

    Notice1:考点串联包含五种基本句型.六种从句.两种语态.九种时态.三单. Notice2:在英语中只要有谓语动词就可称为一句话或者一个句子 (一)五种基本句型: (1)主+谓:         ...

  7. html5渐变的两种方式,HTML5的渐变色 渐变的两种类型 createLinearGradient 和createRadialGradient...

    今天又再看了html5的颜色渐变API,发现没有第一次看那么复杂. 不过我对这个颜色渐变存在着一个疑惑就是两种色带之间,那段是属于两种颜色混合的,有点模糊. 比如从红色变成黄色,在红与黄之间的那个地方 ...

  8. 给图像增加一种噪声,构造并利用至少两种高通滤波器实现频率域的滤波

    给图像增加一种噪声,构造并利用至少两种高通滤波器实现频率域的滤波 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown ...

  9. mysql多索引结构_MySQL 索引结构

    谈到 MYSQL 索引服务端的同学应该是熟悉的不能再熟悉,新建表的时候怎么着都知道先来个主键索引,对于经常查询的列也会加个索引加快查询速度.那么 MYSQL 索引都有哪些类型呢?索引结构是什么样的呢? ...

最新文章

  1. hdu A + B Problem II(大数相加,数组实现)
  2. 隔空投送所有人安全吗_Find X2将采用2K+120Hz屏幕,支持65W;安卓将拥有“隔空投送”;“杀毒霸主”Avast被曝偷卖4.35亿用户数据;...
  3. 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)
  4. 告别2013,迎接2014
  5. 谷歌chrome浏览器的源码分析(五)
  6. way.js - 轻量级、持久化的双向绑定JS库
  7. Yii 2.0高级版 下拉框预设值、默认值
  8. Oracle ADF和Oracle Jet一起工作。 建筑模式
  9. python里orient_OrientDB Python连接操作
  10. 深入浅出InfoPath——动态获取InfoPath中的命名空间
  11. 手把手教你用Python实现“坦克大战”,附详细代码!
  12. textarea输入中文和数字换行解决方法
  13. 【华为云技术分享】【DevCloud · 敏捷智库】如何避免重要需求遗漏?
  14. gitlab ci 自动化部署_lt;为什么准备使用GitLab做CICD流水线?/gt;
  15. Charles的安装及设置
  16. 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度
  17. 邮件营销的5个关键数字
  18. Spring(六)——声明式事物控制
  19. Java基础冒泡排序——高低输出十个学生的成绩
  20. PyCrypto —— 一个极好的信息安全python库

热门文章

  1. linux查看是否有用户在使用分区,在Linux服务器中有几种查看分区表的方法
  2. linux C非阻塞延时,linux 非阻塞式socket编程求助。。
  3. vue 实例化几种方式_Vue组件的三种调用方式
  4. 皮一皮:家里出了个不孝子...
  5. 每日一皮:“快准恨”的程序员叠衣法,还不快学起来?
  6. Spring Boot 2.x基础教程:使用MyBatis的XML配置方式
  7. 为什么只有128KB的魂斗罗,可以那么长的剧情?
  8. Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档
  9. 公益:开放一台Nacos服务端给各位Spring Cloud爱好者
  10. IT从业者进阶指南:如何提升自身的不可替代性