Mysql 使用臨時表比較數據差異以及 臨時表的優化


-- 創建內存級別帶索引的臨時表
CREATE TEMPORARY TABLE 'atest'(
'id' int(11) NOT NULL AUTO_INCREMENT,
'pid' bigint(20) Default 0,
'sid' bigint(20) Default 0,
KEY 'index_pid' ('pid'),
KEY 'index_sid' ('sid')
)  ENGINE =MEMORY DEFAULT CHARSET=utf8;


CREATE TEMPORARY TABLE 'btest'(
'pid' bigint(20) Default 0,
'sid' bigint(20) Default 0,
KEY 'index_pid' ('pid'),
KEY 'index_sid' ('sid')
)  ENGINE =MEMORY DEFAULT CHARSET=utf8;

insert into atest select id ,pid ,sid from tb_parent_student;
insert into btest select pid ,sid from  tb_child join tb_parent on pid=pid;

-- 使用普通方式創建默認臨時表方法 create temporary table atest(
select id ,pid ,sid from tb_parent_student); create temporary table btest(select pid ,sid from tb_child join tb_parent on pid=pid); select *From atest; select *From btest; -- Exists 比較兩個結果集的差異信息 select *From atest where not Exists (select *From btest where atest.pid=btest.pid and atest.sid=btest.sid); select *From btest where not Exists (select *from atest where atest.pid=btest.pid and atest.sid=btest.sid); -- left join select *From atest m left join btest as a on m.pid=a.pid and m.sid=a.sid; select *From btest m left join atest as a on m.pid=a.pid and m.sid=a.sid;

-- 用完及時釋放
drop TEMPORARY TABLE atest;
drop TEMPORARY TABLE btest;

 其中:atest 和btest 兩個臨時表格的數據都有近二十萬數據。

使用普通方式創建默認臨時表執行比較結果集語句耗時(其實還沒執行完我受不了了直接斷開了,后來實際測試大致執行了38分鍾!):

使用內存級別加索引方式創建臨時表執行比較結果耗時:

知道優化后查詢會快很多,但是沒想到能快這么多。

 tips: 臨時表默認大小限制好像是 16M 如果報  XXXtable is full的話可以修改臨時表大小配置進行修改。

如果是Linux下就修改Mysql的配置文件/etc/my.cnf,在[mysqld]下添加/修改兩行:
tmp_table_size = 256M
max_heap_table_size = 256M

如果是win下就修改Mysql的配置文件my.ini,在[my.ini]下添加/修改兩行:
tmp_table_size = 256M
max_heap_table_size = 256M

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM