索引名词疑问点:

聚集索引 == 聚簇 索引

稀疏索引 == 非聚集索引 == 非聚簇索引   (需要回表->查询主键索引)

联合索引:遵循最左前缀原则 

索引优化顺序

  1. 选择:用索引及查询条件减少检索范围
  2. 投影:只取所需字段
  3. 连接:尽量减少连接表,连接表的连接字段需有索引

Mysql使用B+树的原因:

  1. 红黑树必然可以实现平衡性,数据量越大红黑树的高度(lngN)越高,可用多阶树来优化,从而产生B+树。
  2. B+树,多阶特性,每个节点可以容纳多个关键字,可以通过内存访问的局部性原理优化性能。

Mysql B+特性:

  1. B+树,一个节点 为一页,一页默认16K
  2. 根节点常驻内存
  3. 一个bigint索引字段占用:8字节 + 6或4字节(指针大小,具体情况具体看)

 SHOW GLOBAL  STATUS like 'Innodb_page_size' ;  -- 查看innodb 页大小 (默认页大小 :16K)

说明:磁盘中的一页数据(4kb)和数据库innodb规定的一页数据(16kb),这两个的概念是不一样的。磁盘io的大小也是根据指令来规定的。对应数据库读写来说,会按照数据库的配置,每次最少读写一页数据,也就是16kb。

存储引擎技术点:

  1. 存储引擎为表级别
  2. Innodb ,聚集索引(索引和数据在一个文件),支持事务,支持行锁
  3. MyISAM ,非聚集索引(索引和数据文件分离),不支持事务,不支持行锁

Innodb 磁盘存储对应两个文件:

  1. table_name.frm     表结构相关信息
  2. table_name.ibd      索引 + 数据 文件

推荐使用整型自增主键的原因:

  1. 减少mysql自动生成隐藏主键的负担或选择某唯一列字段的成本。
  2. 数值型 比 字符串比较更快,存储空间也相对小
  3. 自增、或相对自增,在叶节点放不下时,总是新增一个数据节点;而如果是非自增主键插入节点空间不足时,会导致B+树 节点分裂后做平衡性调整,相对插入效率较低!另外在物理空间上连续自增保持顺序性,不连续主键的插入会导致页在磁盘存储的不连续性。(有些个人理解!欢迎指教!)

MyISAM 磁盘存储对应三个文件:

  1. table_name.frm      frame表结构相关的信息
  2. table_name.MYD     数据文件
  3. table_name.MYI      索引文件

B+树大致结构


数据库联合索引的叶子结点里面有什么 mysql 联合索引底层结构_数据库联合索引的叶子结点里面有什么

 【扩展】

pagecache和buffercache的区别:

pagecache实际上是针对文件系统的,是文件的缓存,在文件上的数据会缓存到pagecahce,文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成,当pagecache中的数据需要刷新时,pagecache中的数据交给buffercache。但这种处理在2.6版本内核之后就变得简单了,没有真正意义的cache操作。

buffercache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘操作的数据会缓存到buffercache中,如:文件系统的元数据都会缓存到buffercache中。简单来说,

pagecache用来缓存文件数据,buffercache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,数据会缓存到pagecache。若直接采用dd工具对磁盘进行读写,那么数据会

缓存到buffercache。

cache和buffer的区别:

a buffer is something that has yet to be "written" to disk

a cache is something that has been "read" from the disk and stored for later use