client→Server→存储引擎(持久化工具)文件“不同数据文件的组织形式”。

MySQL的文件组织形式:myISAM,Innodb

内存跟磁盘交互的最小逻辑单元是页。 datapage ,大小是由操作系统决定的,一般是4K或者8K,在进行读取的水后一般是页的整数倍。

创建索引的时候有一个Key值,这个Key是什么?

默认情况下是主键,如果没有主键,那么就是一个6字节的row_id,如果一个表中有多个索引的话,应该怎么进行数据存储?怎么存储?

一个误区:把主键自动设为聚簇索引 聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。InnoDB 只聚集在同一个页面中的记录。包含相邻健值的页面可能相距甚远。如果你已经设置了主键为聚簇索引,必须先删除主键,然后添加我们想要的聚簇索引,最后恢复设置主键即可。 此时其他索引只能被定义为非聚簇索引。这个是最大的误区。有的主键还是无意义的自动增量字段,那样的话Clustered index对效率的帮助,完全被浪费了。 刚才说到了,聚簇索引性能最好而且具有唯一性,所以非常珍贵,必须慎重设置。一般要根据这个表最常用的SQL查询方式来进行选择,某个字段作为聚簇索引,或组合聚簇索引,这个要看实际情况。 记住我们的最终目的就是在相同结果集情况下,尽可能减少逻辑IO。

Mysql数据结构的选择

hash表

索引的选择是跟存储引擎县官的,在mysql中memory存储引擎是hash表,而且innodb支持自适应hash

问题

  1. 哈希碰撞,必须要设计良好的hash算法,避免产生hash冲突问题(扰动函数)“大量值的未使用”
  2. hash需要大量的内存,比较占用内存
  3. 无法进行范围查找(一般查询的话范围查找要比等值查找多)

BST 二叉搜索树