MySQL概览5.7

76 阅读4分钟

前言

关系型数据库-关系模型(二维表格模型);二维表格及其之间的联系所组成的一个数据组。

存储引擎 MyISAM、InnoDB

MyISAM 非聚簇索引

  • 不支持行锁,读取时需要读到的所有表加锁,写入时则对表加排他锁
  • 不支持事务
  • 不支持外键
  • 不支持崩溃后的安全恢复
  • 在表有读取查询的同时,支持表中插入新记录
  • 支持BLOB和TEXT的前500个字符索引,支持全文索引
  • 支持延迟更新索引,极大地提升了写入性能
  • 对于不会进行修改地表,支持压缩表,极大地减少了磁盘空间占用

InnoDB 聚簇索引

  • 支持行锁,采用MVCC来支持高并发,有可能死锁
  • 支持事务
  • 支持外键
  • 支持崩溃后地安全恢复
  • 不支持全文索引

字符集和校对规则

索引的使用

索引主要使用的数据结构:BTree和哈希

MySQL中Btree索引使用的时B树中的B+Tree。对于两种存储引擎的实现方式上是不同的。

  1. MyISAM: B+树叶子节点的data域存放的是数据记录的地址。在索引检索时,先按照B+树搜索算法搜素索引,如果指定的Key存在,则取出其data域值,然后通过地址找到相应的数据记录。
  2. InnoDB:其数据文件本身就是索引文件(数据文件是按照B+树组织的索引文件,索引的Key是数据表的主键)。其余的索引都是辅助索引,辅助索引data域存储相应主键的值,而不是地址。

explain 命令

查询结果解析:

type: 显示了连接使用了那种类别,有无使用索引,如果是ALL表示全表扫描

key:显示使用了什么索引,如果想强制MYSQL使用或忽视possible_keys列中的索引,则在查询中使用 Porce index、use index 、ignore index。如果这里未NULL,则说明没有命中索引。

extra:此列如果出现using filesort【需要额外步骤来发现如何对返回的行排序】、using temporary 【需要创建一个临时表来存储结果】,说明查询需要优化

最左前缀原则

mysql 中索引可以以一定顺序引用多列,这种索引叫做联合索引。如果查询条件精准匹配索引的 左边连续1列或几列,则此列就可以被用到

索引覆盖

一个查询语句的执行只需要从辅助索引中就可以得到查询结果,就不需要 查询聚集索引中的记录了。

冗余索引

索引功能相同,能够命中A就肯定能命中B。那么A\b就是冗余索引

查询缓存的使用

开启查询缓存: query_cache_type = 1 query_cache_size = 600000 或者 set global query_cache_type = 1 set global query_cache_size = 600000

开启缓存查询要慎重。尤其对于写密集的应用来说。 如果开启,要注意合理控制缓存空间大小。一般来说几十MB比较合适。 还可以通过sql_cache和sql_no_cache来控制某个语句是否需要进行缓存

事务机制 ACID原则

  1. 原子性:即事务要么全部做完,要么全部不做
  2. 一致性:要一直处于一致的状态
  3. 独立性:并发事务之间不会相互影响
  4. 持久性:事务一旦提交,它所做的修改将还会永远保存在数据库中

为了达到以上事务特性,数据库定义了几种事务隔离级别:

  • 未提交读取:会产生脏读(可以读取到未提交的记录)(不使用)
  • 读已提交:会存在不可重复度以及幻读的现象(修改:读取过数据两次读取的值不一样)(一个查询返回的记录不完全相同)
  • 可重复读取:解决不可重复读问题,会有幻读问题。innoDB使用MVCC +GAP Lock 避免幻读
  • 串行:事务之间互斥,但是并发度急剧下降

数据库默认的事务级别是:可重复读

事务隔离的实现:基于锁机制和并发调度,并发调度使用的MVCC(多版本并发控制),通过保存修改行的旧版本信息来支持并发一致性读和回滚

锁机制

未了解决并发、数据安全的问题,使用锁机制