MySQL 归纳总结

1.MySQL存储引擎

主要使用的就是两个存储引擎,分别是InnoDB和MyISAM。

InnoDB

InnoDB是MySQL的默认存储引擎。
InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。默认的隔离级别是可重复读。通过间隙锁策略防止幻读的出现。
InnoDB表是基于聚簇索引建立的。聚簇索引对主键查询有很高的性能。
InnoDB内部做了很多优化。包括从磁盘读取数据时采用可预测性预读,能够自动在内存中创建Hash索引以加速读操作的自适应哈希索引,以及能够加速插入操作的插入缓冲区等。

MyISAM

MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁。
在MyISAM表,可以基于其前500个字符创建索引。MyISAM也支持全文索引,这是一种基于分词创建但索引,支持复杂但查询。
MyISAM引擎设计简单,数据以紧密格式存储,在某些场景下,性能很好。

InnoDB和MyISAM区别

  1. 是否支持事务
  • InnoDB支持事务
    对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin transaction和commit之间,组成一个事务;
  • MyISAM不支持,
  1. 支持锁的级别不同
  • InnoDB支持行锁
    注意:数据库的主键和索引对锁是有影响的。
    在使用for update的时候,在明确使用主键或者索引的时候才会是行锁,否则就是表锁。
  • MyISAM只支持表锁
  1. 是否支持外键
  • InnoDB支持外键
  • MyISAM不支持。
  • 4. 存放索引的方式

    • InnoDB是聚集索引,
      数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。
      因此,主键不应该过大,因为主键太大,其他索引也都会很大。
    • MyISAM是非聚集索引,数据文件是分离的,
      索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
    1. 查询具体行数的差异
    • InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。
    • MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
    1. 是否支持全文索引
    • Innodb不支持全文索引(innodb引擎在5.6.4版本提供了对全文索引的支持)
    • MyISAM支持全文索引,查询效率上MyISAM要高于Innodb;
Tags: