前言
关系型数据库-关系模型(二维表格模型);二维表格及其之间的联系所组成的一个数据组。
存储引擎 MyISAM、InnoDB
MyISAM 非聚簇索引
- 不支持行锁,读取时需要读到的所有表加锁,写入时则对表加排他锁
- 不支持事务
- 不支持外键
- 不支持崩溃后的安全恢复
- 在表有读取查询的同时,支持表中插入新记录
- 支持BLOB和TEXT的前500个字符索引,支持全文索引
- 支持延迟更新索引,极大地提升了写入性能
- 对于不会进行修改地表,支持压缩表,极大地减少了磁盘空间占用
InnoDB 聚簇索引
- 支持行锁,采用MVCC来支持高并发,有可能死锁
- 支持事务
- 支持外键
- 支持崩溃后地安全恢复
- 不支持全文索引
字符集和校对规则
索引的使用
索引主要使用的数据结构:BTree和哈希
MySQL中Btree索引使用的时B树中的B+Tree。对于两种存储引擎的实现方式上是不同的。
- MyISAM: B+树叶子节点的data域存放的是数据记录的地址。在索引检索时,先按照B+树搜索算法搜素索引,如果指定的Key存在,则取出其data域值,然后通过地址找到相应的数据记录。
- 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原则
- 原子性:即事务要么全部做完,要么全部不做
- 一致性:要一直处于一致的状态
- 独立性:并发事务之间不会相互影响
- 持久性:事务一旦提交,它所做的修改将还会永远保存在数据库中
为了达到以上事务特性,数据库定义了几种事务隔离级别:
- 未提交读取:会产生脏读(可以读取到未提交的记录)(不使用)
- 读已提交:会存在不可重复度以及幻读的现象(修改:读取过数据两次读取的值不一样)(一个查询返回的记录不完全相同)
- 可重复读取:解决不可重复读问题,会有幻读问题。innoDB使用MVCC +GAP Lock 避免幻读
- 串行:事务之间互斥,但是并发度急剧下降
数据库默认的事务级别是:可重复读
事务隔离的实现:基于锁机制和并发调度,并发调度使用的MVCC(多版本并发控制),通过保存修改行的旧版本信息来支持并发一致性读和回滚
锁机制
未了解决并发、数据安全的问题,使用锁机制