- 内存的读写速度远大于磁盘的读写速度,减少磁盘读写,可以作为重点优化方向。
- 数据库内部最重要的就是存储结构,存储结构必然涉及到数据结构知识。比如用到了常用的哈希图、树。
- MYSQL数据库常用两种引擎,InnoDB、MyISAM,可以直接对表指定数据库引擎。
- MYSQL索引是一种数据结构,帮助更快的查询数据。索引使用的是B+树(B树改进版,一个节点可以包含多个值,深度可控,IO读写次数少,三层可以保存数千万个值)。叶子节点存值,其余节点存索引值。数据结构可视化工具:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
- MYSQL生成的表和数据会保存在mysql/data目录下,并以表名生成对应的目录。FRM文件是表设计文件。
- InnoDB引擎,会在mysql/data/表目录下生成IBD文件。IBD文件包含索引和数据,索引是聚集型索引。
- MyISAM引擎,会在mysql/data/表目录下生成MYI和MYD文件,MYI是索引文件,记录存储地址,MYD是数据文件。索引是非聚集型索引。不支持事务。
- 使用索引注意事项:1>.不要在DML频繁的表上加索引(一百万条数据维护B+树耗性能)。 2>.不要在数据较少的表上加索引。3>.尽量不要在索引列上加函数计算。 4>.不要select *查询,索引会失效。5>.在查询比较频繁的表上加索引。6>.在离散量比较大的字段加索引(计算方法:count(distinct col):count(col)越大越好,如uuid,外键ID等)。
- 尽量使用int自增作为主键,因为这样符合数组的特性,数组查询效率较高(访问局部性原理,数组内存地址连续,读取一个扇区的数据放入二级缓存即可,速度更快,不用反复查询内存)。
- InnoDB引擎创建的表,可以不设置主键。但是本身不能没有主键,当不设主键的时候,会在表中找到非NULL并且设置为索引的字段作为主键,如果找不到这样的字段,就用_rowid作为主键,这样会导致查询效率变差。1>全表扫描性能差。2>_rowid实现源自于全局的序列,这样高并发插入数据共享此序列,MYSQL保证数据安全,会加上锁。这必然导致性能降低。
- InnoDB引擎主键索引查询时,会根据索引值直接在叶子节点拿到值。其他如字段索引,会生成个B+树,叶子节点保存本身索引值和主键值,再根据主键值回到主键索引B+树中获取真正的值(回表查询)。