存储引擎
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的,所以存储引擎也可以被称为表引擎。
默认存储引擎是InnoDB。
InnoDB
在 MySQL 5.5 之后,InnoDB 是默认的 MySQL 引擎。
1.支持事务
2.行级锁,提高并发访问性能
3.支持外键约束,保证数据的完整性和正确性
文件:xxx.ibd: xxx代表表名,InnoDB 引擎的每张表都会对应这样一个表空间文件,存储该表的表结构
(frm、sdi)、数据和索引。
参数:innodb_file_per_table,决定多张表共享一个表空间还是每张表对应一个表空间
MyISAM
MyISAM 是 MySQL 早期的默认存储引擎。
特点:
不支持事务,不支持外键
支持表锁,不支持行锁
访问速度快
文件:
xxx.sdi: 存储表结构信息
xxx.MYD: 存储数据
xxx.MYI: 存储索引
Memory
Memory 引擎的表数据是存储在内存中的,受硬件问题、断电问题的影响,只能将这些表作为临时表或
缓存使用。
特点:
存放在内存中,速度快
hash索引(默认)
文件:
xxx.sdi: 存储表结构信息
事物隔离级别
查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;
并发事务
四大特性ACID
原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败
一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下
运行
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
索引
它是帮助MySQL高效获取数据
的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时
通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗
索引的底层数据结构
MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索
引,选择B+树的主要的原因是:第一阶数更多,路径更短,第二个磁盘读写
代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据,第三是B+树便
于扫库和区间查询,叶子节点是一个双向链表
B树和B+树的区别是
第一:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的
所有的数据都会出现在叶子节点,在查询的时候,B+树查找效率更加稳定
第二:在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存
储,并且叶子节点是一个双向链表
什么是聚簇索引什么是非聚簇索引
1.聚簇索引主要是指数据与索引放到一块 B+树的叶子节点保存了整
行数据,有且只有一个,一般情况下主键在作为聚簇索引的
2.非聚簇索引值的是数据与索引分开存储 B+树的叶子节点保存对应的主键,
可以有多个,一般我们自己定义的索引都是非聚簇索引
知道什么是回表查询?
回表的
意思就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引
中所对应的整行数据,这个过程就是回表
覆盖索引是
覆盖索引是指select查询语句使用了索引,在返回的列,必须在索引中全部
能够找到,如果我们使用id查询,它会直接走聚集索引查询,一次索引扫
描,直接返回数据,性能高。
如果按照二级索引查询数据的时候,返回的列中没有创建索引,有可能会触
发回表查询,尽量避免使用select *,尽量在返回的列中都包含添加索引的字
段
MYSQL超大分页怎么处理 ?
超大分页一般都是在数据量比较大时,我们使用了limit分页查
询,并且需要对数据进行排序,这个时候效率就很低,我们可以采用覆盖索
引和子查询来解决
先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个
id列表中的数据就可以了
因为查询id的时候,走的覆盖索引,所以效率可以提升很多
索引失效
1.没有遵循最左匹配法则
2.模糊查询
3.如果%号在前面也会导致索引失效。
4.如果在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效
日志
undo log和redo log
其中redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据,
而undo log 不同,它主要记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据
redo log保证了事务的持久性,undo log保证了事务的原子性和一致性