2017-06-04 89 views
0

我問過一個建議的指標,在​​這裏選擇查詢 mysql: multiple indexes adviceMySQL的:索引中刪除查詢

現在我想專注於一個稍微不同的問題:我還可以在刪除大量的行同一時間(如果你問,我的數據庫支持地圖創建工具,所以你有很多的插入和刪除,並重新插入等等,就像用戶添加和刪除地圖元素一樣多)。 在刪除中是否也使用索引?我想我可以將table1複製到一個新的table2上,但不包括所有未刪除的元素(所以我使用select),刪除舊的table1,然後將table2複製到table1中,這樣table1最終只有它所需的行。當然,如果刪除操作使用索引的方式與select相同,那麼這是無用的。我強調,非常大的表可能會達到數百萬行。 什麼是最好的方法?

編輯:這是節目創建表

|地圖| CREATE TABLE map
px十進制(7,3)NOT NULL,
py十進制(7,3)NOT NULL,
pz十進制(7,3)NOT NULL,
rx十進制(7,3)NOT NULL,
ry十進制(7,3)NOT NULL,
rz十進制(7,3)NOT NULL,
sx十進制(7,3)NOT NULL,
sy十進制(7,3)NOT NULL,
sz十進制(7,3)NOT NULL,
a TINYINT(1)NOT NULL,
b TINYINT(1)NOT NULL,
c TINYINT(1)NOT NULL,
d TINYINT(1)NOT NULL ,
e TINYINT(1)NOT NULL,
f TINYINT(1)NOT NULL,
g TINYINT(1)NOT NULL,
h TINYINT(1)NOT NULL,
i TINYINT(1)NOT NULL,
j TINYINT(1)NOT NULL,
k TINYINT(1)NOT NULL,
l TINYINT(1)NOT NULL,
m文本,
KEY aa ),
KEY bb),
KEY cc),
KEY dd
)ENGINE = InnoDB DEFAULT CHARSET = latin1 |

+0

堆棧溢出不是一個可以獲得關於如何編寫代碼的建議的地方。想想你想做什麼,計劃你想要你的代碼如何工作,最有效的方法是什麼,並進行編碼。使用紙和筆,要有創意。不要選擇簡單的方法。再次,這不是別人會告訴你如何編寫代碼的地方。如果你有一個問題,你認爲將來可能會幫助其他人,那麼編輯並轉發。否則,我會建議你刪除這個問題。 –

+0

我不同意我的要求是關於編碼,實際上我可以處理我的代碼,我的數據庫是給我一些頭痛的問題,我的問題是關於非常高層次的概念和最佳實踐。 –

+0

忽略索引問題(暫時),讓我們看看'DELETE'的外觀。 –

回答

0

處理「更新」的百萬行有多種技術。

  1. 如果是一個完整的替換,建立一個新表,然後交換(RENAME TABLE)。

  2. 如果「更新」需要INSERTUPDATE ...也就是說,一些行是新的,需要一些小的修改,然後看INSERT ... ON DUPLICATE KEY UPDATE ...

  3. 如果您需要兩者的結合,再加上DELETEing一些行,它變得更加混亂,但它可能可以在很少的SQL語句中完成,無需循環。 CREATE並填充(LOAD DATA?)變更集;執行一個多表DELETE;執行INSERT ... SELECT .. LEFT JOIN ..以複製「新」行;做IODKU或多表UPDATEUPDATEs做。我討論一些here

我並沒有完全理解你需要做的事情。哪些技術聽起來很接近?你能否更接近我提出的要求來重新提出你的要求?也許那時我可以更具體。包含SHOW CREATE TABLE可能很有用,並指出在決定插入/刪除/更新內容方面發揮作用的列。

而且,是的,INDEXes對於DELETEsUPDATEs是有用的。

+0

我已添加show create table。相關列是正在創建匹配的a,b,c,d,所有匹配的列可以極其精確地定義要刪除的地圖數據組。列px和pz與範圍匹配(它們表示對象在地圖上的位置)。我的關注點是能夠刪除由a,b,c,d定義的整個對象範圍,然後db將在px和pz範圍內進行搜索。順便說一句,它永遠不會是一個完整的更換或更新,數據將被插入或刪除。 –

+0

你會使用'px = constant'嗎?或'px BETWEEN ..和..'? –

+0

我會測試範圍,所以它將是px> =「左限」和px <=「右限」;這也適用於pz,它將根據底部和頂部限制進行測試。 –