背景:项目使用的是MariaDB(即MYSQL卖给Oracle后,怕以后会闭源,开发者在5.5分支新扯的分支)。
MySQL5.5以后默认选用的是InnoDB存储引擎,5.5以前是myisam。
下面这些问题,都是个人觉得典型的,自己整理记录。
第一个问题是:InnoDB和myisam的区别?
答:1,存储结构的不同,前者在磁盘上是两个文件,即frm(表定义文件)和ibd(数据文件);后者是三个文件,即frm(表定义文件),myd(数据文件),myi(索引文件)。
2, InnoDB支持事务,MyISAM不支持事务,新增更新多的使用InnoDB,查询多的使用MyISAM。
3,InnoDB是聚集索引,使用B+Tree的索引结构,叶子节点存数据,数据和索引在一个文件-数据文件中;MyISAM是非聚集索引,也使用B+Tree,但是叶子节点存的是指针,数据和索引不在同一个文件中。
4,InnoDB支持行级锁,MyISAM支持的是表级锁。
5,InnoDB必须有主键,推荐使用自增id,即使没有索引,MySQL会自己维护一个主键。
第二个问题是:InnoDB为什么推荐使用自增ID作为主键?
答:自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。
第三个问题是:为什么选择B+树索引结构?
答:官方给出的,一个索引可以支持存储16kb,上千万条数据3次磁盘io就能读到内存中。磁盘io操作消费的时间比内存操作,要大的多的多,所以减少磁盘io就是减少耗时。可以看看这个博文
https://www.cnblogs.com/sunshineliulu/p/11516851.html
索引结构有二叉树,红黑树,有序链表,hash,B Tree,B+树。
sql优化:https://mp.weixin.qq.com/s/yAvZNH2S-TINnxOt_rsJdA