zoukankan      html  css  js  c++  java
  • mysql 临时表

    当查询大表时,我们可以通过构造临时表来避免频繁的遍历大表。临时表只有当前连接可见,当连接断开时会被自动drop,下文给出临时表的应用例子。

    前提:

    1、分别构造表t_demo_test1和t_demo_test2,并输入数据:

    DROP TABLE IF EXISTS t_demo_test1;
    CREATE TABLE IF NOT EXISTS t_demo_test1(
        tid int(20) NOT NULL AUTO_INCREMENT,
        userid int(20),
        day datetime NOT NULL,
        title varchar(50),
        content varchar(200),
        PRIMARY KEY(tid)
    )ENGINE=InnoDB  DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;
    
    DROP TABLE IF EXISTS t_demo_test2;
    CREATE TABLE IF NOT EXISTS t_demo_test2(
        tid int(20) NOT NULL AUTO_INCREMENT,
        userid int(20),
        name varchar(50),
        class varchar(50),
        PRIMARY KEY(tid)
    )ENGINE=InnoDB  DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;
    
    insert into t_demo_test2(userid, name, class) values(11, 'fred', 'important class');
    
    insert into t_demo_test1(userid, day, title, content) 
    values(10,'2015-04-05 22:10:30','title1','content sinny write test')
    ,(11,'2015-04-05 22:10:30','title1','一种内容1')
    ,(12,'2015-04-06 22:10:30','title1','一种内容2')
    ,(13,'2015-04-07 22:10:30','title1','一种内容3')
    ,(14,'2015-04-08 22:10:30','title1','一种内容4');

    2、直接构造临时表

    CREATE TEMPORARY TABLE tmp_table SELECT userid, name FROM t_demo_test2;

    3、在存储过程中使用临时表

    DELIMITER //
    DROP PROCEDURE IF EXISTS p_modify_content;
    CREATE PROCEDURE p_modify_content
    (
        IN v_mcontent varchar(10),
        OUT v_output varchar(100),
        OUT v_count int
    )
    BEGIN
        DECLARE tmpid int(20);
        DECLARE tname varchar(50);
        DECLARE tuserid int(20);
        DECLARE done INT DEFAULT FALSE;
        DECLARE cur CURSOR FOR SELECT t_demo_test1.userid, t_demo_test1.tid FROM t_demo_test1;    
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        OPEN cur;
        
        DROP TEMPORARY TABLE IF EXISTS usertmp;
     
        CREATE TEMPORARY TABLE usertmp(
            userid int(20),
            name varchar(50)
        ) ENGINE = MEMORY;
        
        myloop: LOOP
            FETCH cur INTO tuserid, tmpid;
    
            IF done THEN
                LEAVE myloop;
            END IF;
            
            SELECT t_demo_test2.name from t_demo_test2 WHERE userid = tuserid INTO tname;
            
            select tname;
            IF !isNull(tname) THEN    
                INSERT INTO usertmp VALUES(tuserid, tname);
            END IF;
            
            UPDATE t_demo_test1 SET content = concat(content,v_mcontent, tname) WHERE tid = tmpid;    
            SET done = FALSE;/* SELECT t_demo_test2.name from t_demo_test2 WHERE userid = tuserid INTO tname; 也会触发NOT FOUND */
            SET tname = null;
        END LOOP;
        SELECT COUNT(*) FROM usertmp INTO v_count;
        SET v_output = 'finished';
        CLOSE cur;
        DROP TEMPORARY TABLE IF EXISTS usertmp;
    END
    //
    
    call p_modify_content("hello", @content, @count);
    select @content;//输出finished
    select @count;//输出1

    4、临时表与内存表的区别

    临时表,schema和数据都在内存中,创建表后,无法通过show tables看到该表,重新进入后无表、无数据;

    内存表,schema在硬盘中,数据在内存中,创建表后可以在show tables看到该表,重新进入后有表,无数据; 

    如下,建立内存表:

    create table XXtable(
        。。。
    )engine = HEAP;
  • 相关阅读:
    各种排序算法的时间复杂度
    svn版本管理系统出现的问题解决办法
    算法时间复杂度
    js处理时间戳显示的问题
    cache缓存的BUG
    使用phpstorm提交svn代码版本管理系统遇到的问题解决办法
    20161101.20161115这两周的开发总结
    mac 上安装 redis
    终极 shell zsh
    在 mac 上利用 homebrew 安装软件
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/4668045.html
Copyright © 2011-2022 走看看