• 高性能MySQL笔记


    MySQL架构将查询处理及其他系统任务和数据的存储/提取相分离。

    死锁检测和死锁超时机制:InnoDB处理死锁的方法是将持有最少行级排它锁的事物回滚。

    事务日志

    两阶段锁定协议

    多版本并发控制:实现方式有乐观并发控制和悲观并发控制。InnoDB中是每行保存两个隐藏的列来实现的。

    1 数据类型

    1.1 数值类型:

    整数(TININT,SMALLINT,MEDIUMINT,INT/INTEGER,BIGINT)

    浮点数(float,double),定点数(decimal,MySQL内部以字符串形式存放,默认decimal(10,0))

    位类型(BIT)

    1.2 日期时间类型:

    DATE(4字节)

    TIME(3字节)

    DATETIME(8字节) 

    TIMESTAMP(4字节) 支持的时间范围小,插入和查询受时区影响

    YEAR(1字节)

    1.3 字符串类型:

    char 固定长度,0-255,检索时删除了尾部的空格   vs   varchar可变长度,0-65535,检索时保留空格

    binary vs varbinary

    BLOB vs TEXT 最好对使用该字段的表开启碎片整理,避免删除后存在的“空洞”。

    ENUM 0-255个成员,需1字节;256-65535个成员,需2字节;最多65535个。

    SET 与ENUM区别是,Set类型一次可以选取多个成员,而ENUM只能选取一个。

    2 SQL优化

    2.1 大批量插入数据

    1)因为InonDB类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效地提高导入数据的效率;

    2)导入前执行SET UNIQUE_CHECKS=0,关闭唯一性验证;导入完成后,恢复;

    3)导入前执行SET AUTOCOMMIT=0,关闭自动提交;导入完成后,恢复。

    2.2 优化Insert语句

    1)一条INSERT尽量插入多值;

    2)使用INSERT DELAYED,让INSERT语句马上执行;

    3)使用LOAD DATA FILE。

    2.3 优化GROUP BY语句

    如果查询包含GROUP BY,但是用户想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。

    2.4 优化ORDER BY语句

    WHERE条件和ORDER BY使用相同的索引,并且ORDER BY的顺序和索引顺序相同,并且ORDER BY字段都是升序或降序的,此时可以使用一个索引来排序,而不需要额外的排序。

    2.5 优化嵌套查询

    JOIN更有效率些。

    2.6 MySQL如何优化OR条件

    or条件分别是两个独立索引的话,实际是对OR的各个字段分别查询后的结果进行了UNION。

    在建友复合索引的列上面做OR操作的时候,就不能使用索引。

    2.7 使用SQL提示

    USE INDEX

    IGNORE INDEX

    FORCE INDEX

    3 数据库对象优化

    优化表的数据结构

    表拆分 垂直拆分,水平拆分

    逆规范化

    使用中间表提高统计查询速度

    4 锁

    4.1 MyISAM的表锁

    并发插入

    锁调度

    4.2 InnoDB的行锁

    脏读,不可重复读,幻读其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决,方式可分为两种:

    1)读前加锁;

    2)不加锁,通过一定机制生成一个数据请求时间点的一致性数据快照,即MVCC。

    行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同的记录,但是如果使用相同的索引键,是会出现锁冲突的。

    InnoDB会在范围条件加锁时使用间隙锁;在使用相等条件时请求一个不存在的记录加锁,也会使用间隙锁(Next-Key Lock)。

    MySQL 在InnoDB引擎下有当前读快照读两种模式。
    当前读即加锁读,读取记录的最新版本号,会加锁保证其他并发事物不能修改当前记录,直至释放锁。插入/更新/删除操作默认使用当前读,显示的为select语句加lock in share mode或for update的查询也采用当前读模式。
    快照读:不加锁,读取记录的快照版本,而非最新版本,使用MVCC机制,最大的好处是读取不需要加锁,读写不冲突,用于读操作多于写操作的应用,因此在不显示加[lock in share mode]/[for update]的select语句,即普通的一条select语句默认都是使用快照读MVCC实现模式。

  • 相关阅读:
    PyQt5--基础篇:用eric6工具实现三级联动效果
    Django--基本篇:项目结构与设计模式(MVC)
    python文件最基础的读写删除
    Begin using git (Part1)
    Begin using git
    通用刷新数据源代码
    Combox程序中自定义数据源
    表内父子关系的递归查询
    C++ 获取数组长度
    Linux在终端里面切换root用户
  • 原文地址:https://www.cnblogs.com/cheungchein/p/8906555.html
Copyright © 2020-2023  润新知