2017-06-07 58 views
0

我需要在一對一的關係中爲每個俱樂部插入一個finance_entity。 我決定在mysql服務器上運行它,因爲單個插入速度更慢。我怎麼能優化這個跑得更快?有沒有辦法破解插入select來做到這一點?什麼是插入與現有條目的新關係的最快方式?

我不能把club_id放在finance_entity上,因爲多了一個關係指向它。

alter table clubs add column finance_entity_id int unsigned null after id; 
DELIMITER ! 
drop procedure if exists create_entities! 
create procedure create_entities() 
begin 
    create_entities_for_club: loop 
     set @club_key = (select id from clubs where finance_entity_id is null limit 1); 

     insert into finance_entity (id) value (null); 
     update clubs set finance_entity_id = last_insert_id() where id = @club_key; 


     if @club_key is null then 
      leave create_entities_for_club; 
     end if; 
    end loop create_entities_for_club; 
end! 
call create_entities_for_club()! 

DELIMITER ; 

alter table clubs change column finance_entity_id finance_entity_id int unsigned not null; 
alter table clubs add unique (finance_entity_id); 

回答

0

設置臨時密鑰似乎是最快的方法。

除此之外,緩衝區中足夠大的尺寸是必不可少的,事實證明我的測試機器只有16M的緩衝區大小。

這些添加到您的my.ini或my.cnf中

innodb_buffer_pool_size=1024M 
innodb_additional_mem_pool_size = 8M 
innodb_log_file_size = 256M 
innodb_log_buffer_size = 512M 

使用此插入表中,增加和指數club_id,可能使它更快。

alter table finance_entity add column club_id int unsigned null; 
insert into finance_entity (club_id) select id from clubs; 

update clubs join finance_entity on clubs.id = finance_entity.club_id 
set finance_entity_id = finance_entity.id; 

alter table finance_entity drop column club_id; 

這對於2萬個條目在1.6秒內運行。

+0

也就是說,做一個查詢中的所有行;不要圍繞1行查詢進行循環。 –

0

如果它與現有表格的比例是1:1,只需具有相同的PRIMARY KEY,但是而不是將其稱爲AUTO_INCREMENT

+0

它可以被多個表引用,在這種情況下共享密鑰會混淆。 –

+0

@OlaviSau - 如果表格是1:1,那麼我建議讓兩個_same_鍵都是_less_混淆。 (或者我錯過了你的觀點?) –

+0

你錯過了一點,表格是1:1到很多表格。 –

相關問題