数据库存储引擎和优化

MyISAM、InnoDB区别

l MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。

l MyISAM表不支持外键,InnoDB支持

l MyISAM锁的粒度是表级,而InnoDB支持行级锁定。

l MyISAM支持全文类型索引,而InnoDB不支持全文索引。(mysql 5.6后innodb支持全文索引)

MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时

候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。

MyISAM和InnoDB索引实现:

MyISAM索引实现

MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。

l 主索引

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。 

 数据库存储引擎和优化

 

l 辅助索引

在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

 数据库存储引擎和优化

MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

InnoDB索引实现

然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同.

l 主索引

InnoDB表数据文件本身就是主索引。

 数据库存储引擎和优化

InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

l 辅助索引

InnoDB的所有辅助索引都引用主键作为data域。

 数据库存储引擎和优化

聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

 

不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白

1、为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,

2、用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

 

InnoDB索引和MyISAM索引的区别:

l 一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

l 二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

mylSAM存储优化:
禁用索引
alter table  table_name disable keys
alter table table_name enable keys
禁用唯一性检查:
禁用语句:set unique_checks=0
开启语句:set unique_checks=1
批量插入数据:
使用load data infile 语句比insert 语句速度快

innoDB优化:
禁用唯一检查:

禁用语句:set unique_checks=0
开启语句:set unique_checks=1
禁用外键检查:
禁用:set foreign_key_checks=0
开启:set foreign_key_checks=1
禁止自动提交:
禁用:set autocommit=0
开启:set autocommit=1