mysql总结

索引概述:

  • 索引是高效获取数据的数据结构

索引结构:

  • B+Tree()

  • Hash(不支持范围查询,精准匹配效率极高)

存储引擎:

常见存储引擎:

  • Myisam:5.5之前默认引擎,支持表锁,不支持外键和事务,查询插入性能很高

  • InnoDB:支持事务,外键,支持行级锁,5.5之后默认存储引擎,5.6之后支持全文索引

  • Memory:所有数据置于内存中,拥有极高的效率,但是重启数据会丢失

  • Archive:拥有很快的插入速度,但是查询相对差劲

  • Federated:将不同的mysql服务器联合,逻辑形成一个完整的数据库,适合分布式场景

树的区别:

  • 二叉树:可能产生不平衡,顺序数据可能会出现链表结构

  • 平衡二叉树:插入需要自旋,性能根据层级而定,性能不稳定

  • b+tree:

    • 主键聚簇叶子节点存放数据,非叶子节点存放索引,

    • 二级索引非叶子节点存放索引,叶子节点存放主键

索引优缺点:

优点:

  • 大大加快查询速度

  • 使用分组和排序时候可以显著减少分组和排序时间

  • 唯一索引可以保证字段唯一

  • 可以加速表与表之间的连接

缺点

  • 创建和维护索引需要消耗时间,随着数据量增加时间也会增加

  • 占用磁盘空间

  • 对表进行urd操作时候也要动态维护,urd性能会下降

创建索引原则(我们对哪种数据创建索引):

  • 更新频繁数据不易创建索引

  • 数据量少的没必要创建,全表和用索引可能差不多

  • 首先考虑在where和orderby字段建立索引

索引分类:

单列索引(只包含单个列):

  • 主键索引:唯一且不为null,一个表只能有一个,(聚集索引:叶子节点下存储数据)

  • 唯一索引:唯一且只能有一个Null值(二级索引,叶子节点存储主键)

  • 普通索引:没有限制(二级索引,叶子节点存储主键)

组合索引/复合索引(包含多列):

  • 为了避免回表,进行更高效的查询

全文索引:

  • like+%(InnoDB(5.6之后支持)默认3个字符,最大84,MyISam默认4最小1个字符)

空间索引(使用较少)

Sql性能分析

  • 数据库的执行频次

    - show session status like 'Com_____'; --查询当前会话统计结果
    - show global status like 'Com_____'; --查询字数据库上次启动至今的结果
    - show status  like 'Innodb_rows_%';
  • 慢查询日志

    -- 查看慢日志配置信息 
    show variables like '%slow_query_log%’;

    -- 开启慢日志查询
    set global slow_query_log=1;

    -- 查看慢日志记录SQL的最低阈值时间
    show variables like 'long_query_time%’;

    -- 修改慢日志记录SQL的最低阈值时间
    set global long_query_time=4;
  • profile Sql执行查询

  • explain/desc执行计划查询

    • id 相同表示加载表的顺序是从上到下。

    • id 不同id值越大,优先级越高,越先被执行。

    • id 有相同,也有不同,同时存在。id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id的值越大,优先级越高,越先执行。

    • type含义

    • extra含义

索引使用

联合索引:

  • 遵循最左原则,如果最左使用中间跳过了某个字段,会造成后面索引失效,范围查询右侧的列会失效,尽量是<= ,>=

索引失效:

  • 索引列进行了函数运算

  • 没有遵循最有匹配原则

  • 字符串类型索引没有加'',造成隐士转换,导致索引失效

  • 左模糊查询

  • 如果最左使用中间跳过了某个字段,会造成后面索引失效,范围查询右侧的列会失效,尽量是<= ,>=

  • mysql优化器判定全表比用索引块

  • or链接索引失效

sql提示:

  • 多个索引下,可以提醒执行器是由哪个索引,建议使用,忽略使用,强制使用

覆盖索引:

  • 查询返回字段都在联合索引中会直接拿到数据,避免回表即联合索引

前缀索引:

  • 针对字段数据库较大的建立索引,缩小索引长度

单列/联合索引:

  • 避免单列索引在and情况下第二索引不生效,使用联合索引,使用恰当可避免回表

索引设计原则

  • 表层面:数据量大,且查询频繁

  • 字段层面:经常在where groupby orderby后的字段

  • 索引层: 唯一的建立唯一索引,尽量联合索引,大文本尽量前缀索引

  • 附加原则:

    • 区分度较高

    • 索引不易过多

    • 索引不为null加上非空约束

    • 所长度尽量短

锁机制

锁的分类:

按粒度分:

  • 全局锁:锁定全局,用于数据备份保证数据库完整性

  • 表锁(加锁快,并发低,不会死锁):

    • 表锁:锁定整张表

    • 元数据锁:保证数据完整执行,修改的锁会和所有锁冲突

    • 意向锁:为了避免加表锁时候,全局扫描行锁

  • 行锁(加锁慢,锁冲突低,并发高,会死锁)

    • 行锁:锁定单行数据

    • 间隙锁:锁定间隙,不包含当前数据

    • 临键锁:锁定当前数据和间隙(行锁+间隙锁)

按类型分:

  • 读锁(共享):阻塞写,可读

  • 写锁(排他):阻塞读写

事务

事务隔离级别:

  • 读未提交:一个事务可以读取另一个事务未提交的数据(脏读,不可重复读,幻读)

  • 读已提交:可读取另一个事务已经提交的事务(不可重复读,幻读)

  • 不可重复读(默认):事务开启时不在允许修改操作,可避免脏读,不可重复读但是会造成(幻读)

  • 串行化:最高事务隔离级别,效率低下

大批量数据插入优化

  • 主键顺序插入

  • 批量插入减少IO,批量最好500左右

  • load加载数据至数据结构

    -- 1、首先,检查一个全局系统变量 'local_infile' 的状态, 如果得到如下显示 Value=OFF,则说明这是不可用的
    show global variables like 'local_infile';
     
    -- 2、修改local_infile值为on,开启local_infile
    set global local_infile=1;
     
    -- 3、加载数据
    /*
    脚本文件介绍 :
      sql1.log ----> 主键有序
      sql2.log ----> 主键无序
    */
    load data local infile 'D:\\sql_data\\sql1.log' into table tb_user fields terminated by ',' lines terminated by '\n';
  • 关闭唯一性校验,加载后再打开

    -- 关闭唯一性校验
    SET UNIQUE_CHECKS=0;
     
    truncate table tb_user;
    load data local infile 'D:\\sql_data\\sql1.log' into table tb_user fields terminated by ',' lines terminated by '\n';
     
    SET UNIQUE_CHECKS=1;
  • 减少事务,批量执行数据

mysql总结:索引,存储引擎,大批量数据插入,事务,锁的更多相关文章

  1. MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

    文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...

  2. MySQL最全存储引擎、索引使用及SQL优化的实践

    1 MySQL的体系结构概述 整个MySQL Server由以下组成 :Connection Pool :连接池组件Management Services & Utilities :管理服务和 ...

  3. 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

    重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...

  4. Mysql 版本号、存储引擎、索引查询

    [1]Mysql 版本号.存储引擎.索引查询 # 查看数据库版本号 SELECT VERSION(); # 查看数据库支持的引擎(默认即Support == DEFAULT行) SHOW ENGINE ...

  5. 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)

    MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...

  6. MySQL数据库InnoDB存储引擎中的锁机制

    MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...

  7. MySQL支持多种存储引擎

    MySQL的强大之处在于它的插件式存储引擎,我们可以基于表的特点使用不同的存储引擎,从而达到最好的性能. MySQL有多种存储引擎:MyISAM.InnoDB.MERGE.MEMORY(HEAP).B ...

  8. MySQL存储引擎,优化,事务

    1唯一约束unique和主键key的区别?     1.什么是数据的存储引擎?       存储引擎就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数 ...

  9. MySQL的常见存储引擎介绍与参数设置调优

    MySQL常用存储引擎之MyISAM 特性: 1.并发性与锁级别 2.表损坏修复 check table tablename repair table tablename 3.MyISAM表支持的索引 ...

随机推荐

  1. python 小兵(10)内置函数

    内置函数(下午讲解) 什么是内置函数?就是python帮我们提供的一个工具,拿过直接用就行,比如我们的print,input,type,id等等.截止到python3.6.2版本 中一共提供了68个内 ...

  2. Hadoop支持LZO

    0. 环境准备 maven(下载安装,配置环境变量,修改sitting.xml加阿里云镜像)gcc-c++zlib-develautoconfautomakelibtool通过yum安装即可 yum ...

  3. 微服务架构 | 7.2 构建使用 JWT 令牌存储的 OAuth2 安全认证

    目录 前言 1. JWT 令牌存储基础知识 1.1 JSON Web Token 2. 构建使用 JWT 令牌存储的 OAuth2 服务器 2.1 引入 pom.xml 依赖文件 2.2 创建 JWT ...

  4. js文件中三斜杠注释///reference path的用途

    编辑某个js文件时,要想这个js文件出现其他js成员的ide提示,可以在js文件开头使用3个斜杠注释和reference指令的path指向此js文件路径,这样在编写这个js文件时,ide就会自动出现p ...

  5. java中构造函数和一般函数的区别

    构造方法 特点: 1.方法名称和类名相同 2.不用定义返回值类型 3.不可以写return语句 作用: 给对象初始化 构造方法的细节: 当一个类中没有定义构造函数时,系统会默认添加一个无参的构造方法. ...

  6. JS实现new关键字的功能

    一.前言 众所周知:没有对象怎么办?那就new一个! 那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢? 现在我们就来剖析一下原生JS中new关键字内部的工作原理. 二.原始 ...

  7. 导航控制器跳转时隐藏底部tabbar

    - (void)setting { // 跳转到设置界面 XMGSettingViewController *settingVc = [[XMGSettingViewController alloc] ...

  8. LNMP架构的源码编译以及yum安装

    LNMP架构的源码编译以及yum安装 目录 LNMP架构的源码编译以及yum安装 一.LNMP架构的编译安装 1. 安装nginx服务 (1)关闭防火墙 (2)安装依赖包 (3)创建运行用户 (4)编 ...

  9. 【HDU6687】Rikka with Stable Marriage(Trie树 贪心)

    题目链接 大意 给定\(A,B\)两个数组,让他们进行匹配. 我们称\(A_i\)与\(B_j\)的匹配是稳定的,当且仅当目前所剩元素不存在\(A_x\)或\(B_y\)使得 \(A_i\oplus ...

  10. Java一维与二维数组的拷贝与排序

    Java一维与二维数组的拷贝与排序 目录 Java一维与二维数组的拷贝与排序 Arrays.sort() 一维数组升序排序 二维数组按行升序排序 二维数组按列升序排序 Java中的数组 Java中数组 ...