我已在此处询问有关索引和选择查询的建议 mysql: multiple indexes advice
现在我想专注于一个稍微不同的问题:我还必须同时删除大量行(如果你问,我的数据库支持地图创建工具,所以你有很多插入并删除和重新插入等用户添加和删除地图元素的数量。 删除中使用的索引也是吗?我想我可以将table1复制到一个新的table2上,不包括所有未删除的元素(所以我使用select),删除旧的table1,然后复制table1中的table2,这样table1最终只得到它需要的行。当然,如果删除操作使用索引的方式与select相同,那么这是无用的。我强调非常大的表可能达到数百万行。 什么是最好的方法?
编辑:这是show create table
|地图| 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 a
(a
),
KEY b
(b
),
KEY c
(c
),
KEY d
(d
)
)ENGINE = InnoDB DEFAULT CHARSET = latin1 |
答案 0 :(得分:0)
有多种技术可以处理“更新”的一百万行。
如果是完全替换,请构建一个新表,然后交换(RENAME TABLE
)。
如果“更新”需要INSERT
或UPDATE
...也就是说,某些行是新的,有些行需要稍作修改,然后查看INSERT ... ON DUPLICATE KEY UPDATE ...
如果你需要两者的某种组合,加上DELETEing
一些行,它会变得更加混乱,但它可能在很少的SQL语句中完成,没有循环。 CREATE
并填充(LOAD DATA
?)更改集;执行多表DELETE
;执行INSERT ... SELECT .. LEFT JOIN ..
复制“新”行;做IODKU或多表UPDATE
做UPDATEs
。我讨论了一些here。
我不完全了解你需要做什么。以下哪种技术听起来很接近?你能否按照我的建议改写你的要求?也许那时我可以更具体。包含SHOW CREATE TABLE
并指出在决定插入/删除/更新内容中起作用的列可能会很有用。
是的,INDEXes
对DELETEs
和UPDATEs
非常有用。