2014-01-20 52 views
0

我有一個數據庫,我用一個自動生成的索引鍵存儲一些值。我也有一個:M映射表是這樣的:選擇所有的ID和插入缺失的數據

create table data(id int not null identity(1,1), col1 int not null, col2 varchar(256) not null); 
create table otherdata(id int not null identity(1.1), value varchar(256) not null); 
create table data_map(dataid int not null, otherdataid int not null); 

每天data表需要用新的值,其中很多都是已經存在的名單進行更新,但需要插入data_map (然後生成密鑰otherdata,因此在此表中數據總是新的)。

做這將是第一次嘗試將所有值的方法,然後選擇生成的ID,然後插入data_map

mydata = [] # list of tuples 
cursor.executemany("if not exists (select * from data where col1 = %d and col2 = %d) insert into data (col1, col2) values (%d, %d)", mydata); 

# now select the id's 
# [...] 

但是這顯然是很糟糕,因爲我需要選擇所有的東西沒有使用密鑰,我也需要做檢查而不使用密鑰,所以我需要先索引數據,否則一切都很慢。

我的下一個方法是使用散列函數(如md5或crc64)在col1和col2上生成我自己的散列,以便能夠在不使用select的情況下插入所有值,並且能夠在插入缺失時使用索引鍵值。

這可以優化,還是我可以做的最好的事情? 每行更改> 500k,其中可能有20-50%將在數據庫中。 時序明智,它看起來像計算散列比插入數據到數據庫要快得多。

回答

-1

就我所關心的,你使用mysql.connector。如果是,當你運行cursor.execute()時,你不應該使用%d類型。一切應該只是%s和連接器將做類型轉換這項工作

+0

這與OP的問題沒有關係。雖然是真的,但它應該是一個評論。 –

+0

我很想去,但我仍然沒有聲望在其他叉子上發表評論。 – EvilAnton

+0

好吧,這是afaik只是在郵件列表上的共識,並沒有嚴格定義在PEP左右的地方。 PEP只是定義你可以使用某種格式化字符串。 – reox