• mysql存储引擎


     

    1.引擎介绍&事务

    引擎:数据存在数据库中不同的格式和方法

    mysql最常用引擎:MyISAM和InnoDB,在mysql5.5.5以前,默认的存储引擎为MyISAM,之后版本默认为InnoDB

    比较:InnoDB对事物完整性更好以及有更高的并发性

    事务:逻辑上的一组SQL语句操作,组成这组操作的各SQL语句要么全成功要么全失败。

    事务的四大特性(ACID):原子性(不可分割的单位)、一致性、隔离性、持久性——四大特性适用于大多数关系型数据库

    2.MyISAM

    mysql MyISAM三个系统文件:

    表定义文件user.frm、数据文件user.MYD、索引文件user.MYI                  #通过file该文件可以看到其中内容

    MyISAM特点:

    1)不支持事务

    2)表级锁定(更新时锁整个表)

    3)读写互相阻塞

    4)只会缓存索引(key_buffer_size),以大大提高访问性能减少磁盘IO,但是不会缓存数据

    5)读取速度较快,占用资源相对少

    6)不支持外键约束,但支持全文索引

    MyISAM适用的场景:

    1)不需要事务支持的业务

    2)一般为读数据比较多的网站应用,读写都频繁的场景不适合,读多或写多的场合适合

    3)并发访问相对比较低的业务(纯读纯写高并发也可以)

    4)数据修改相对较少的业务

    5)以读为主的业务,如www,blog,图片信息数据库,用户数据库,商品库等业务

    6)对数据一致性要求不是很高的业务

    7)硬件资源比较差的机器还想打到比较好的效果可用MyISAM

    MyISAM引擎调优:

    1)设置合适的索引

    2)调整读写优先级,根据实际需求保证重要操作更优先执行

    3)启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)

    4)尽量顺序操作让insert数据都写入到尾部,减少阻塞

    5)分解大的时间长的操作,降低单个操作的阻塞时间

    6)降低并发数(减少对mysql访问),对于高并发应用场景可采用排队机制

    7)对于更改不频繁的数据,可用Query Cache或memcached缓存服务可以极大的提高访问效率

    关于mysql缓存的几个参数:

    query_cache_size = 256M

    query_cache_limit = 1M

    query_cache_min_res_unit = 2k

    8)MyISAM的count只有在全表扫描的时候高效,带有其他条件的count都需要进行实际的数据访问

    9)把主从同步的主库使用InnoDB,从库使用MyISAM引擎,但是出于维护数据库的角度也不推荐此方法。

    3.InnoDB

    mysql InnoDB文件:

    InnoDB特点:

    1)支持事务:ACID

    2)行级锁定(更新时一般是锁定当前行),通过索引实现,全表扫描仍然是锁表,所以要建立索引

    3)读写阻塞与事务隔离级别有关

    4)具有高效的缓存特性

    5)整个表和主键以cluster方式存储,组成一棵平衡树

    6)所有secondary index都会保存主键信息

    7)支持分区,表空间,类似oracle

    8)支持外键约束,5.5以前的版本不支持全文索引,以后支持 

    9)对硬件资源的要求相比MyISAM高

    InnoDB适用的场景:

    1)需要事务支持的业务

    2)行级锁对高并发有很好的适应能力,但需确保查询通过索引完成

    3)数据读写及更新较为频繁的场景

    4)数据一致性要求较高的业务

    5)硬件设备内存较大,可用InnoDB较好的缓存能力来提高内存利用率,尽可能减少IO

    InnoDB的参数,可查:grep innodb /etc/my.cnf

    如果想将内容存放在不同的ibdata文件,可通过调整以下参数:

    【mysqld】

    innodb_file_per_table                             #按表生成文件

    innodb_data_home_dir = /data/XXX

    6)相比MyISAM引擎,InnoDB引擎更消耗资源,速度没有MyISAM引擎快

    InnoDB引擎调优:

    1)主键尽可能小,避免secondary index带来过大的空间负担

    2)避免全盘扫描

    3)尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO消耗

    4)在大批量小插入的时候,尽可能自己控制事务而不是使用autocommit自动提交,有开关可以控制提交方式

    5)合理设置innodb_flush_log_at_trx_commit参数值(代表刷到磁盘上的频率),不要过度追求安全

    6)避免主键更新,因为会造成大量的数据移动

    4.mysql引擎实战

    如何查看mysql里有几个引擎可以用?

    更改引擎:

    方法1)alter table student ENGINE=MyISAM;

    方法2)使用sed对备份内容进行引擎转换,数据量会很大:

    mysqldump > oldboy_1.sql

    nohup sed -e 's/MyISAM/InnoDB/g' oldboy_2.sql > oldboy_1.sql

    mysql < oldboy_1.sql

    方法3)mysql_convert_table_format命令修改:

    #!/bin/bash

    cd /usr/local/mysql/bin

    echo 'Enter Host Name:'

    read HOSTNAME

    echo 'Enter User Name:'

    read USERNAME

    ...

    ./mysql_convert_table_format --host=$HOSTNAME --user=$USERNAME --password=$PASSWD --socket=$SOCKETPATH --type=$TBTYPE $DBNAME $TBNAME

    即mysql_convert_table_format --user=root --password=456 --socket /data/3306/mysql.sock --engine=MyISAM oldboy t2                 #改oldboy库表t2的引擎模式

    #对于my.cnf要配置的参数,可以在以下位置找到官方的配置参数文件:

    2018年11月7日

    祝好!

  • 相关阅读:
    JVM类加载器
    Java类加载过程
    进程间8种通信方式详解
    SpringCloud教程(Finchley版本)-00:什么是SpringCloud
    pyinstaller打包web项目
    Type javax.xml.bind.JAXBContext not present
    Cannot execute request on any known server
    websocket原理
    falsk模板jinja2与Vue冲突解决方案
    关于springboot Error resolving template之类问题
  • 原文地址:https://www.cnblogs.com/wangke2017/p/9751219.html
Copyright © 2020-2023  润新知