MySQL学习

MySQL应用

  • MySQL高级应用
    • MySQL事务
      • 事务的隔离级别
    • Mysql索引
      • 概述
      • 优势和劣势
      • 索引结构
        • BTREE索引
      • 索引分类
      • 索引语法
      • 索引设计原则
    • 视图
    • 存储过程和函数
    • 触发器
  • MySQL体系结构
    • 存储引擎
      • 各种存储引擎的特性
      • 存储引擎的选择
  • SQL优化
    • SQL语句优化
    • 索引使用
      • 避免索引失效
    • 其他优化
      • 大批量插入数据时
      • INSERT优化
      • ORDER BY优化
        • MYSQL中的两种排序方式
      • Filesort优化

MySQL高级应用

MySQL事务

事务指的是逻辑上的一组操作,这组操作必须全部成功事务才算成功。

特性:

  1. 原子性:事务不可分割,组成事务的各个逻辑单元不可分割
  2. 一致性:事务执行前后,数据完整性保持一致
  3. 隔离性:一个事务的执行不能受到其他事务的干扰
  4. 持久性:事务一旦结束,数据就持久化到数据库中

事务的隔离级别

如果不考虑隔离性,会产生一些安全问题:

  • 脏读:读到另一个事务未提交的数据
  • 不可重复读:在一个事务当中,读到另一个事务已经提交update的数据,导致提交前后多次查询结果不一致
  • 虚读/幻读:在一个事务当中,读到另一事务已经提交insert的数据,导致提交前后多次查询结果不一致

通过设置事务的隔离级别解决安全性问题

  • read uncommitted(未提交读):都不可避免
  • read committed(提交读):避免脏读
  • repeatable read(可重复读):避免脏读和不可重复读
  • serializable(可串行化):都可避免,不允许并发访问

Mysql索引

概述

帮助Mysql进行高效查询的一种数据结构。

Mysql维护这种特殊的数据结构,并与表项对应起来,进行高效查询。

优势和劣势

  • 优势
    • 提高查询效率,降低I/O成本
    • 通过索引对数据排序可以降低排序的成本,降低CPU消耗
  • 劣势
    • 索引实际上也是一张表,表中保存主键和索引字段,指向实体记录,因此是一种以空间换时间的做法
    • 索引会降低更新表的速度,进行更新操作时,MySQL不仅需要进行数据的更新,也需要对索引数据结构进行维护,调整。

索引结构

索引在存储引擎层中实现,每种存储引擎索引都不一定完全相同。

目前有四种索引:

  • BTREE索引:B树索引,最常见的索引类型
  • HASH索引:仅Memory引擎支持,使用场景简单
  • R-tree索引(空间索引):MyISAM引擎提供,主要用于地理空间数据类型
  • Full-text(全文索引):MyISAM引擎提供

平时所说的索引,一般指B+树索引,多路搜索树。

BTREE索引

  1. B树

    所有叶子结点在同一层,每个非叶子结点都由n个key和n+1个指针组成

    叶子结点的指针指向null

  2. B+树

    key信息保存在叶子结点中,所有非叶子结点都可以看作Key的索引部分。

    要查找到一条信息,必须要查到叶子结点

  3. MySQL中的B+Tree

    在原有B+树的基础上,增加了一个指向相邻叶子结点的链表指针,提高区间访问的性能。

索引分类

  1. 单值索引:一个索引只包含单个列,一个表中可以有多个单值索引
  2. 唯一索引:索引列的值必须唯一,允许有空值
  3. 复合索引:一个索引包含多个列

索引语法

可以在创建表结构的时候创建,也可以对已有表增加新的索引。

create [unique|fulltext|spatial] index index_name [using index-type] on table_name(col_name,...)

索引设计原则

提升索引使用效率

  • 对查询频次较高的,且数据量比较大的表建立索引
  • 对经常在where子句条件中出现的列添加索引
  • 使用唯一索引,区分度越高,使用索引的效率越高
  • 索引不是越多越好,过多的索引会造成表更新的代价过大
  • 使用短索引,索引创建后在硬盘中存储,因此提高索引访问的I/O效率,也可以提高整体访问效率。
  • 利用最左前缀,组合索引相当于创建了N个索引,查询时包含最左部分字段,就相当于创建了已经索引,可以使用组合索引。

视图

一种虚拟存在的表,是通过sql脚本动态生成的。

优势:

  • 简单:视图是过滤好复合条件的结果集
  • 安全:对表的权限管理不能精确到行和列,通过视图可以做到
  • 数据独立:视图结构一旦确定,就可以屏蔽表结构变化带来的影响

语法:

create view view_name [(col_name)] as [select语句] 

可以更新,修改,删除视图中的数据,会对原表作出相同的操作。但是不建议

存储过程和函数

事先经过编译并存储在数据库中的一段SQL语言的集合,可以简化应用开发人员的工作,减少数据在数据库和应用服务器之间的传输。

  1. 存储过程:无返回值的函数
  2. 存储函数:有返回值

触发器

触发器是与表有关的数据库对象,可以在某个操作之前或之后触发,触发并执行触发器中定义的sql语言集合。

可以协助应用在数据库段确保数据的完整性,日志记录,数据校验等。

触发器类型 NEW和OLD的使用
INSERT new表示将要或已经新增的数据
UPDATE old表示修改前的,new表示将要或已修改后的
DELETE OLD表示将要或已删除的数据
create trigger trigger_name before/after insert/update/delete on table_name
[for each row]--行级触发器
begin
	--trigger_contents
end;

MySQL体系结构

  1. connector:各种语言的链接器

  2. MySQL Server

    1. connection poll:链接层,开启线程处理请求
    2. 管理服务与工具
    3. interface:各种SQL数据库对象
    4. Parser:解析器,解析SQL语言
    5. optimizer:优化器,SQL语句优化
    6. 缓存
  3. 存储引擎:插件式如:InnoDB

    根据需求不同,选择不同引擎

  4. 文件系统:文件和日志,还有索引信息等

层级结构:

  1. 链接层:客户端连接请求以及线程池服务。
  2. 服务层:核心服务功能,包括SQL接口,分析,优化等,还包括缓存,提高性能
  3. 引擎层:负责数据的存储和提取
  4. 存储层:将数据存储在文件系统上

MySQL最有特色的地方就是可插拔式的存储引擎

存储引擎

存储数据、建立索引、更新查询数据等技术的实现方式。

存储引擎是基于表的,因此也可称为表类型。

各种存储引擎的特性

  1. InnoDB:当前MySQL默认存储引擎

    • 事务安全
    • 支持行锁,更适合高并发
    • 支持外键
  2. MyISAM:之前默认存储引擎

    • 没有事务概念
    • 只支持表锁
    • 不支持外键
  3. MEMORY

    表数据存储在内存中,访问效率高,默认使用HASH索引, 并且是易失性的。

  4. MERGE

    一组MyISAM表的组合,这些表结构必须完全相同。

    MERGE表本身并不存储数据,实际是内部的MyISAM表完成存储。

存储引擎的选择

  • InnoDB:默认存储引擎,各种都适用
  • MyISAM:读和插入为主的应用,比较快
  • MEMORY:需要快速定位记录的环境下
  • MERGE:分布式,数据仓库等环境

SQL优化

SQL语句优化

使用explain命令查看一条SQL语句是如何执行的。

索引使用

索引是数据库优化最常用,最重要的手段之一。

主键字段会自动创建索引

避免索引失效

  1. 全值匹配

    对索引中所有列都制定具体值

  2. 最左前缀法则

    对于复合索引,必须包含当前字段左边所有的列。否则将不会使用全部索引。

    如果跳过中间的列,将只用满足最左前缀部分的索引。

  3. 范围查询列右边的列将不能使用索引。

  4. 索引列上不能进行运算操作,否则将失效

  5. 字符串不加单引号会造成索引失效:由于底层会做一个隐式类型转化,相当于做了运算操作

  6. 尽量使用覆盖索引,只访问加了索引的列。

    如果访问未加索引的列,那么由于索引中并没有记录所有的数据,因此会造成回表查询,造成效率的降低。

  7. 用or分割开的条件,如果or两边的列有一列无索引,则不会使用索引

  8. 以%开头的like模糊匹配操作,不走索引

    可以通过覆盖索引解决

  9. SQL进行评估,如果全表扫描比走索引更快,则不会走索引

    如:is NULL, is not NULL 有时会失效

    主要看数据中,查询数据的比例问题。

  10. in 走索引,not in不走索引

  11. 尽量使用复合索引,少使用单列索引

    因为复合索引相当于创建多个索引。

    当查询多个加了单列索引的列时,数据库会选择性能最优的索引,而不会使用全部索引。

其他优化

大批量插入数据时

  1. 使用load指令,按主键顺序插入
  2. 关闭唯一性校验
  3. 手动提交事务

INSERT优化

  • 多次Insert时,可以将多条Insert合并成一条,减少连接数据库的次数
  • 将事务更改为手动提交,如果大量数据,可以分块提交
  • 数据有序插入

ORDER BY优化

MYSQL中的两种排序方式

  1. filesort:如果返回列中存在无索引列时,需要先得到返回的无序数据,再进行排序
  2. using index:通过有序扫描索引,直接获得有序返回数据
  • 如果是多字段排序,最好同样排序方式,否则会不走索引
  • 多字段排序,字段排列顺序需要和索引排列顺序相同

Filesort优化

有两种排序算法:两次扫描,和一次扫描

一次扫描会一次性把所有数据都读入内存,再进行排序,最后取得需要的数据,但是需要很大的排序区内存空间。

因此可以通过调整排序区大小,提高排序效率。

你可能感兴趣的:(面试学习记录,数据库,mysql)