zoukankan      html  css  js  c++  java
  • Mysql存储引擎-MyISAM

    Mysql存储引擎-MyISAM

    项目背景:

      公司接入数据中,有一个是过车数据,数据量非常大,每天大概有几百万数据,峰值上千万(就是道路上车辆通行数据),在老的项目中是按照数据接入时间进行分表的,每天都会生成一张新表,这也只能按照数据接入时间进行分表查询,但是这也就有一个问题,如果按照过车经过时间进行查询就需要跨表进行进行查询,这也的效率就比较低,查询也比较慢,查询也非常不方便。所以就考虑使用这种MyIsam这种搜索引擎进行存储分表,还是每天新建一张表,但是会有一张总表,查询的时候只需要查询这张总表就可以了,所有的数据都可以查询。所以就对改存储引擎进行了一番了解:

    1、mysql存储引擎
    InnoDB 引擎(MySQL5.5以后默认使用)
    MyISAM引擎

    2、Mysql MERGE引擎简介
    一. 什么是MERGE引擎
    MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询。

    二. 应用场景
    如果需要把日志纪录不停的录入MySQL数据库,并且每天、每周或者每个月都创建一个单一的表,而且要时常进行来自多个表的合计查询,MERGE表这时会非常简单有效。

    3、建表案例:
    CREATE TABLE `t1` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log` varchar(45) ,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM;

    CREATE TABLE `t2`(
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log` varchar(45) ,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM;

    CREATE TABLE `t` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log` varchar(45) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MERGE UNION=(t1, t2) INSERT_METHOD=LAST;

    alter table t ENGINE=MRG_MyISAM UNION=(t1,t2,t3) INSERT_METHOD=LAST;

    1)ENGINE=MERGE
    指明使用MERGE引擎,有些同学可能见到过ENGINE=MRG_MyISAM的例子,也是对的,它们是一回事。

    2)UNION=(t1, t2)
    指明了MERGE表中挂接了些哪表,可以通过alter table的方式修改UNION的值,以实现增删MERGE表子表的功能。

    3)INSERT_METHOD=LAST
    INSERT_METHOD指明插入方式,取值可以是:0 不允许插入;FIRST 插入到UNION中的第一个表; LAST 插入到UNION中的最后一个表。

    4)MERGE表及构成MERGE数据表结构的各成员数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。


    4、MyISAM Merge的一些问题:
    1)建表时UNION指明的子表如果存在相同主键的记录会怎么样?
    相同主键的记录会同时存在于MERGE中,就像第三节中的例子所示。但如果继续向MERGE表中插入数据,若数据主键已存在则无法插入。换言之,MERGE表只对建表之后的操作负责。

    2)**重要** 若MREGE后存在重复主键,按主键查询会是什么结果?
    顺序查询,只出现一条查询记录即停止。比如第三节中的例子,如果执行

    select * from t where id=1;
    只会得到结果
    +----+--------+
    | id | log |
    +----+--------+
    | 1 | test1 |
    +----+--------+



    3)直接删除一个子表会出现什么情况,正确删除的方式是怎样的?
    MERGE表会被破坏,正确方式是用alter table方式先将子表从MERGE表中去除,再删除子表。
    alter table t ENGINE=MRG_MyISAM UNION=(t1) INSERT_METHOD=LAST;
    可以从MERGE表中去除t2,这里你可以安全的对t2进行任何操作了。


    4)误删子表时,如何恢复MERGE表?
    误删子表时,MERGE表上将无法进行任何操作。
    方法1,drop MERGE表,重建。重建时注意在UNION部分去掉误删的子表。
    方法2,建立MERGE表时,会在数据库目录下生成一个.MRG文件,比如设表名为t,则文件名为t.MRG。
    文件内容类似:
    t1
    t2
    #INSERT_METHOD=LAST
    指明了MGEGE表的子表构成及插入方式。
    可以直接修改此文件,去掉误删表的表名。然后执行flush tables即可修复MERGE表。


    5)MERGE的子表中之前有记录,且有自增主键,则MERGE表创建后,向其插入记录时主键以什么规则自增?
    以各表中的AUTO_INCREMENT最大值做为下一次插入记录的主键值。
    比如t1的自增ID至6,t2至4,则创建MERGE表后,插入的下一条记录ID将会是7


    6)两个结构完全相同的但已存在数据的表,是否一定可以合成一个MEREGE表?
    从实验的结果看,不是这样的,有时创建出的表,无法进行任何操作。
    所以,推荐的使用方法是先有一个MERGE表,里面只包含一张表,当一个这个表的的大小增长到一定程度(比如200w)时,创建另一张空表,将其挂入MERGE表,然后继续插入记录。


    7)删除MERGE表是否会对子表产生影响?
    不会


    8)MREGE表的子表的ENGIN是否有要求?
    有的,必须是MyISAM表


  • 相关阅读:
    k8s-[排查记录]解决节点无法查看pod日志
    k8s kube-proxy模式
    容器网络
    k8s-使用kubeadm安装集群
    k8s-Deployment重启方案
    k8s-NetworkPolicy-网络策略
    nodejs 解析终端特殊字符
    fluentd 日志自定义字段解析
    题目笔记 CF 1494b
    CF1225D Power Products(分解质因子 哈希)
  • 原文地址:https://www.cnblogs.com/chengzhihua/p/13578130.html
Copyright © 2011-2022 走看看