索引名词疑问点:
聚集索引 == 聚簇 索引
稀疏索引 == 非聚集索引 == 非聚簇索引 (需要回表->查询主键索引)
联合索引:遵循最左前缀原则
索引优化顺序
- 选择:用索引及查询条件减少检索范围
- 投影:只取所需字段
- 连接:尽量减少连接表,连接表的连接字段需有索引
Mysql使用B+树的原因:
- 红黑树必然可以实现平衡性,数据量越大红黑树的高度(lngN)越高,可用多阶树来优化,从而产生B+树。
- B+树,多阶特性,每个节点可以容纳多个关键字,可以通过内存访问的局部性原理优化性能。
Mysql B+特性:
- B+树,一个节点 为一页,一页默认16K
- 根节点常驻内存
- 一个bigint索引字段占用:8字节 + 6或4字节(指针大小,具体情况具体看)
SHOW GLOBAL STATUS like 'Innodb_page_size' ; -- 查看innodb 页大小 (默认页大小 :16K)
说明:磁盘中的一页数据(4kb)和数据库innodb规定的一页数据(16kb),这两个的概念是不一样的。磁盘io的大小也是根据指令来规定的。对应数据库读写来说,会按照数据库的配置,每次最少读写一页数据,也就是16kb。
存储引擎技术点:
- 存储引擎为表级别
- Innodb ,聚集索引(索引和数据在一个文件),支持事务,支持行锁
- MyISAM ,非聚集索引(索引和数据文件分离),不支持事务,不支持行锁
Innodb 磁盘存储对应两个文件:
- table_name.frm 表结构相关信息
- table_name.ibd 索引 + 数据 文件
推荐使用整型自增主键的原因:
- 减少mysql自动生成隐藏主键的负担或选择某唯一列字段的成本。
- 数值型 比 字符串比较更快,存储空间也相对小
- 自增、或相对自增,在叶节点放不下时,总是新增一个数据节点;而如果是非自增主键插入节点空间不足时,会导致B+树 节点分裂后做平衡性调整,相对插入效率较低!另外在物理空间上连续自增保持顺序性,不连续主键的插入会导致页在磁盘存储的不连续性。(有些个人理解!欢迎指教!)
MyISAM 磁盘存储对应三个文件:
- table_name.frm frame表结构相关的信息
- table_name.MYD 数据文件
- table_name.MYI 索引文件
B+树大致结构
【扩展】
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