为什么要有索引
因为加速查询,快呀!!!这是我回答面试官的第一句话,哈哈。
首先数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果
没有索引的话,要从 500 万行数据里面检索一条数据,只能依次遍历这张表的全部数据,直到找到这条数据。
但是有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种特殊
的专门用来快速检索的数据结构,我们找到数据存放的磁盘地址以后,就可以拿到数据
了
在 InnoDB 里面,索引类型有三种
-
普通(Normal):也叫非唯一索引,是最普通的索引,没有任何的限制。
-
唯一(Unique):唯一索引要求键值不能重复。另外需要注意的是,主键索引是一
种特殊的唯一索引,它还多了一个限制条件,要求键值不能为空。主键索引用 primay key
创建。 -
全文(Fulltext):针对比较大的数据,比如我们存放的是消息内容,有几 KB 的数
据的这种情况,如果要解决 like 查询效率低的问题,可以创建全文索引。只有文本类型
的字段才可以创建全文索引,比如 char、varchar、text 。全文检索的时候可以使用match匹配内容
mysql的存储结构
表空间、段、簇、页、行。
- 表空间 table space:表空间可以看做是 InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。分为:系统表空间、独占表空间、通用表空间、临时表空间、Undo 表空间。
- 段 segment:表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等,段是一个逻辑 的概念创建一个索引会创建两个段,一个是索引段:leaf node segment,一个是数据段: non-leaf node segment。索引段管理非叶子节点的数据。数据段管理叶子节点的数据。 也就是说,一个表的段数,就是索引的个数乘以2。
- 簇 Extent:一个段(Segment)又由很多的簇(也可以叫区)组成,每个区的大小是 1MB(64 个连续的页)。每一个段至少会有一个簇,一个段所管理的空间大小是无限的,可以一直扩展下去, 但是扩展的最小单位就是簇
- 页 Page:
为了高效管理物理空间,对簇进一步细分,就得到了页。簇是由连续的页(Page) 组成的空间,一个簇中有 64 个连续的页。 (1MB/16KB=64)。这些页面在物理上和 逻辑上都是连续的。
跟大多数数据库一样,InnoDB 也有页的概念(也可以称为块),每个页默认 16KB。 页是 InnoDB 存储引擎磁盘管理的最小单位,通过 innodb_page_size 设置。
一个表空间最多拥有 2^32 个页,默认情况下一个页的大小为 16KB,也就是说一个 表空间最多存储 64TB 的数据。
注:page是操作系统的叫法,在硬件中被称为块。
SHOW VARIABLES LIKE 'innodb_page_size';
查看innodb的page_size;