上篇主要和大家探讨了Innodb引擎中出现幻读的处理方法与死锁的探测及避免死锁的一些注意事项。此篇,我们来研究下Innodb的索引。

Innodb里涉及到的索引主要有四种,分别为聚簇索引(Clustered Index)、次级索引(Secondary Index)、全文索引(FULLTEXT Index)、哈希索引(Hash Index)。

聚簇索引与次级索引

每一个Innodb表都有一个唯一的聚簇索引。一般来说,每个表的主键就是聚簇索引。如果你的表中没有定义主键,那么MySQL会将第一个非空唯一索引作为聚簇索引。如果表中既没有主键,也没有合适的唯一索引,Innodb会自己生成一个隐藏的聚簇索引。

通过聚簇索引的查询速度是很快的,因为查询到的索引会直接指向数据行。如果一个表的数据量非常大,聚簇索引会频繁的被读写而造成I/O负载教高。特别是数据文件与索引文件不在一个文件的情况下。

次级索引,所有非聚簇索引的索引就被称为次级索引。次级索引可以有很多个,每一个次级索引记录内都包含主键列。用户在使用次级索引查询时,MySQL根据次级索引对应的主键进行查询。如果主键所占的字节过大,那么次级索引也就需要更大的空间。所以,主键还是越短越好。

全文索引

Innodb在5.5之后支持全文索引。全文索引能帮助用户快速查询设置了全文索引的列。全文索引可以使用CREATE TABLE或ALTER TABLE或CREATE INDEX等语法设置。

全文索引有一个被称为“反转索引”的设计。反转索引存储数据列中出现的每一个单词。它会将数据列中的文档划分为不同的单词,将单词、单词所在的位置信息、偏移量等信息都存储在全文索引表里。

下面介绍下存储全文索引的“全文索引表”,首先进行以下操作:

mysql> use test;

mysql> create table opening_lines

( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

opening_line TEXT(500),

author VARCHAR(200),

title VARCHAR(200),

FULLTEXT idx (opening_line) )

ENGINE=InnoDB;

Query OK, 0 rows affected (0.11 sec)

mysql> select table_id, name, space from INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE name LIKE 'test/%';

+----------+----------------------------------------------------+-------+

| table_id | name                                               | space |

+----------+----------------------------------------------------+-------+

|       54 | test/FTS_0000000000000030_0000000000000039_INDEX_1 |    40 |

|       55 | test/FTS_0000000000000030_0000000000000039_INDEX_2 |    41 |

|       56 | test/FTS_0000000000000030_0000000000000039_INDEX_3 |    42 |

|       57 | test/FTS_0000000000000030_0000000000000039_INDEX_4 |    43 |

|       58 | test/FTS_0000000000000030_0000000000000039_INDEX_5 |    44 |

|       59 | test/FTS_0000000000000030_0000000000000039_INDEX_6 |    45 |

|       51 | test/FTS_0000000000000030_BEING_DELETED            |    37 |

|       52 | test/FTS_0000000000000030_BEING_DELETED_CACHE      |    38 |

|       53 | test/FTS_0000000000000030_CONFIG                   |    39 |

|       49 | test/FTS_0000000000000030_DELETED                  |    35 |

|       50 | test/FTS_0000000000000030_DELETED_CACHE            |    36 |

|       45 | test/b#P#p0                                        |    31 |

|       46 | test/b#P#p1                                        |    32 |

|       47 | test/b#P#p2                                        |    33 |

|       21 | test/imptest                                       |     7 |

|       48 | test/opening_lines                                 |    34 |

|       20 | test/product                                       |     6 |

|       42 | test/t                                             |    28 |

+----------+----------------------------------------------------+-------+

18 rows in set (0.01 sec)

首先在数据库内创建一个有全文索引的表”opening_lines”,然后查看innodb的系统表信息。

类似test/FTS_XXXXXXX_XXXXXXXX_INDEX_XX的就是索引表。索引表以FTS_为前缀,INDEX_XX为后缀。表的命名规则如下:我们可以看到,opeining_lines表对应的table_id是48,48转换为16进制为30,而索引表的名称中第一个下划线后面也是跟的00000..030,它们是相对应的。另外一个具有对应关系的是索引表名称中第二个下划线后面的值,此例中该值为39,转换为10进制是57,这个值为索引ID。根据索引ID可查询到table_id。

mysql> select index_id,name,table_id,space from INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE index_id=57;

+----------+------+----------+-------+

| index_id | name | table_id | space |

+----------+------+----------+-------+

|       57 | idx  |       48 |    34 |

+----------+------+----------+-------+

1 row in set (0.01 sec)

可以看到,查询出来的值所对应的table_id就是opening_lines所对应的table_id。

全文索引将文档内的单词过滤出来存放到不同的索引表里,此操作可能在高并发的情况下产生大量的I/O操作,从而影响系统性能。为此,MySQL设计了全文索引缓存。该缓存存储最近插入的数据索引,当缓存存满时,再将索引数据批量写入到磁盘中。由于存在缓存,在事务中,MySQL对全文索引有特殊的处理方式,全文索引必须在事务提交后才会生效。可以参考以下例子:

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO opening_lines(opening_line,author,title) VALUES

-> ('Call me Ishmael.','Herman Melville','Moby-Dick'),

-> ('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'),

-> ('I am an invisible man.','Ralph Ellison','Invisible Man'),

-> ('Where now? Who now? When now?','Samuel Beckett','The Unnamable'),

-> ('It was love at first sight.','Joseph Heller','Catch-22'),

-> ('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'),

-> ('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'),

-> ('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451');

Query OK, 8 rows affected (0.02 sec)

Records: 8  Duplicates: 0  Warnings: 0

mysql> SELECT COUNT(*) FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');

+----------+

| COUNT(*) |

+----------+

|        0 |

+----------+

1 row in set (0.02 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT COUNT(*) FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');

+----------+

| COUNT(*) |

+----------+

|        1 |

+----------+

1 row in set (0.00 sec)

在提交前,查询不到关键词’Ishmael’,在提交后就查询到了。

哈希索引

启动哈希索引的参数为innodb_adaptive_hash_index。哈希索引将B-tree索引树上的关键字进行哈希处理存放到哈希表上。哈希索引主要用于精确查找,如=,IN等。像LIKE或通配符的查找不适合使用哈希索引。哈希索引由于是对索引关键字进行哈希操作,而变换之后的哈希值的大小关系无法与原始值相对应。所以哈希索引无法被用来避免数据的排序操作。

mysql innodb博客_细聊MySQL的Innodb存储引擎(完)相关推荐

  1. mf怎么使mysql信息分区_细聊MySQL的分区功能

    此篇主要介绍下MySQL的分区功能.我们分别从分区的概念.分区对于MySQL应用的优点.分区的类别及设置来和大家一起探讨下MySQL的分区. 什么是分区? MySQL在未启用分区功能时,数据库的单个表 ...

  2. mysql数据库语句分类_细数MySQL中SQL语句的分类

    1:数据定义语言(DDL) 用于创建.修改.和删除数据库内的数据结构,如:1:创建和删除数据库(CREATE DATABASE || DROP  DATABASE):2:创建.修改.重命名.删除表(C ...

  3. mysql语句大全 新浪博客_经典的MYSQL语句

    这真是一个好东西:学习好了很受用的哦-- SQL分类: DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete,Update,In ...

  4. node+koa2+mysql搭建博客后台

    本文将详细讲解使用node+koa2+mysql搭建博客后台的全过程. 开发环境 node 8.3.0及以上 npm 5.3.0及以上 mysql 5.7.21 具体的环境配置可查看我的上一篇文章 准 ...

  5. 细聊MySQL之常用工具及基本操作(完)

    细聊MySQL之常用工具及基本操作(一) 细聊MySQL之常用工具及基本操作(二) 细聊MySQL之常用工具及基本操作(三) 细聊MySQL之常用工具及基本操作(完) 十.binlog查看工具mysq ...

  6. node mysql和koa_node+koa2+mysql搭建博客后台

    本文将详细讲解使用node+koa2+mysql搭建博客后台的全过程. 开发环境 node 8.3.0及以上 npm 5.3.0及以上 mysql 5.7.21 具体的环境配置可查看我的上一篇文章 准 ...

  7. PHP+MySQL实现博客管理系统

    DataBase 数据库课程设计 实验目标 PHP+MySQL实现博客管理系统 使用语言 后台-php 前端-html css js 相关知识可以在菜鸟教程学习,链接如下菜鸟教程 实验步骤 一. 环境 ...

  8. php mysql博客源码下载_PHP+MySQL实现博客系统

    [实例简介] PHP+MySQL实现博客系统,只实现了基础功能.(前端或者其他功能,可以自己扩展) [实例截图] [核心代码] a9c31135-59a3-4f53-a8a9-145c13812532 ...

  9. ubantu20.04服务器使用docker以及docker-compose编排部署前后端分离个人博客项目(springboot+vue+mysql+redis)

    ubantu20.04使用docker部署前后端分离个人博客项目(springboot+vue+mysql+redis) 前言 本博客是基于springboot+vue+jwt+redis+mysql ...

最新文章

  1. 洛谷 1195 口袋的天空
  2. MySQL数据库优化(五)
  3. java中一个数轮流除去所有数_Java实现A、B两人轮流从盒中取球,取出球的数目必须是:1,3,7或者8个...
  4. Asp.net 调用sqlserver存储过程参数传中文乱码!
  5. ALSA DAPM创建codec到codec的dai连接
  6. python-weed的seaweedfs使用指南
  7. (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏
  8. 服务器上系统怎么启动iis,IIS服务器如何重新启动
  9. 破解sublime 3207(2019.6.3更新)
  10. PIL中的paste方法拼接透明背景照片
  11. 用k-mer分析进行基因组调查:(四)用GenomeScope评估基因组特征
  12. %几.几//C语言(闲的没事,记录下)
  13. 组装一台台式计算机的流程,如何组装电脑?组装电脑的操作流程!
  14. matlab函数im2bw_答复同学Matlab roipoly函数的用法
  15. WinForm dataGridView连接Access数据库
  16. 百度发布AI 2020年十大科技趋势
  17. 高通平台之TP代码分析
  18. PHP 将数组按照Key分组
  19. 阿里巴巴的机器视觉有多强!ET城市大脑发布四大AI视觉产品
  20. project的使用

热门文章

  1. RTMP推流直播流媒体平台LiveQing鉴权直播拉转直播开放直播支持推送总流量和播放总流量统计
  2. 外煤关注:百度收购大部分糯米股份
  3. 关于高性能mysql的读书报告_《高性能MySQL》读书笔记:第一章[MySQL架构与历史]...
  4. 读书笔记-精准努力-因为理解所以宽容
  5. 欣赏几个面馆的logo
  6. 原生JS添加样式 内联important
  7. java io 装饰者_Java IO 装饰者模式
  8. java 过滤sql特殊字符_防止特殊字符SQL注入实现方案
  9. 玩传奇想要得到奖励就一定要有足够的耐心
  10. 超经典,阿里巴巴历年高频面试题汇总:前端岗