diff --git a/数据库/MySQL/附录3 MySQL索引类型.md b/数据库/MySQL/附录3 MySQL索引类型.md index 6e0fb4cb..ab79bede 100644 --- a/数据库/MySQL/附录3 MySQL索引类型.md +++ b/数据库/MySQL/附录3 MySQL索引类型.md @@ -89,6 +89,24 @@ CREATE TABLE `table` ( ); ``` +主键设计的原则: +1. 一定要显式定义主键 +2. 采用与业务无关的单独列 +3. 采用自增列 +4. 数据类型采用int,并尽可能小,能用tinyint就不用int,能用int就不用bigint +5. 将主键放在表的第一列 + + +这样设计的原因: +1. 在innodb引擎中只能有一个聚集索引,我们知道,聚集索引的叶子节点上直接存有行数据,所以聚集索引列尽量不要更改,而innodb表在有主键时会自动将主键设为聚集索引,如果不显式定义主键,会选第一个没有null值的唯一索引作为聚集索引,唯一索引涉及到的列内容难免被修改引发存储碎片且可能不是递增关系,存取效率低,所以最好显式定义主键且采用与业务无关的列以避免修改;如果这个条件也不符合,就会自动添加一个不可见不可引用的6byte大小的rowid作为聚集索引 + + +2. 需采用自增列来使数据顺序插入,新增数据顺序插入到当前索引的后面,符合叶子节点的分裂顺序,性能较高;若不用自增列,数据的插入近似于随机,插入时需要插入到现在索引页的某个中间位置,需要移动数据,造成大量的数据碎片,索引结构松散,性能很差 + +3. 在主键插入时,会判断是否有重复值,所以尽量采用较小的数据类型,以减小比对长度提高性能,且可以减小存储需求,磁盘占用小,进而减少磁盘IO和内存占用;而且主键存储占用小,普通索引的占用也相应较小,减少占用,减少IO,且存储索引的页中能包含较多的数据,减少页的分裂,提高效率 + +4. 将主键放在表的第一列好像是习惯,原因我也不知道,试了下是可以放在其他列的...... + ### 组合索引 @@ -207,3 +225,4 @@ select username, score from t1 where username = '小明' > MySQL中常用的索引结构有:B+树索引和哈希索引两种。目前建表用的B+树索引就是BTREE索引。 > 在MySQL中,MyISAM和InnoDB两种存储引擎都不支持哈希索引。只有HEAP/MEMORY引擎才能显示支持哈希索引。 + diff --git a/数据库/MySQL/附录6 MySQL分库分表.md b/数据库/MySQL/附录6 MySQL分库分表.md index eb6d7634..fd2674f9 100644 --- a/数据库/MySQL/附录6 MySQL分库分表.md +++ b/数据库/MySQL/附录6 MySQL分库分表.md @@ -132,7 +132,7 @@ Mysql服务器之间的主从同步是基于二进制日志BINLOG机制,主服 5. slave还会创建一个SQL线程,从Relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db. -### 主从同步方法 +### 主从同步机制 ![](image/2021-09-02-10-14-13.png) diff --git a/数据库/数据库.xmind b/数据库/数据库.xmind index 88118c3f..821e877e 100644 Binary files a/数据库/数据库.xmind and b/数据库/数据库.xmind differ