【问题标题】:mysql: indexes in a delete querymysql:删除查询中的索引
【发布时间】:2017-06-04 16:44:51
【问题描述】:

我在此处询问了有关索引和选择查询的建议 mysql: multiple indexes advice

现在我想关注一个稍微不同的问题:我还必须同时删除很多行(如果你问的话,我的数据库支持地图创建工具,所以你有很多插入和删除, 并重新插入等,与用户添加和删除地图元素一样多)。 删除中也使用索引吗?我想我可以将 table1 复制到一个新的 table2 上,不包括所有未被删除的元素(所以我使用 select),删除旧的 table1,然后将 table2 复制到 table1 中,这样 table1 最终只有它需要的行。当然,如果删除操作以与选择相同的方式使用索引,这是没有用的。我强调非常大的表可能达到数百万行。 最好的方法是什么?

编辑:这是显示创建表

|地图 |创建表 map (
px decimal(7,3) NOT NULL,
py decimal(7,3) NOT NULL,
pz decimal(7,3) NOT NULL ,
rx decimal(7,3) NOT NULL,
ry decimal(7,3) NOT NULL,
rz decimal(7,3) NOT NULL,
@ 987654329@ decimal(7,3) NOT NULL,
sy decimal(7,3) NOT NULL,
sz decimal(7,3) NOT NULL,
a tinyint(1 ) 非空,
b tinyint(1) 非空,
c tinyint(1) 非空,
d tinyint(1) 非空,
e tinyint (1) 非空,
f tinyint(1) 非空,
g tinyint(1) 非空,
h tinyint(1) 非空,
@987654340 @ tinyint(1) 非空,
@tinyint(1) 非空,
k tinyint(1) 非空,
l tinyint(1) 非空,
m文字,
a (a),
b (b),
c (c),
d (d)
) 引擎=InnoDB 默认字符集=latin1 |

【问题讨论】:

  • Stack Overflow 不是您可以就如何编写代码获得建议的地方。想想你想做什么,计划你希望你的代码如何工作,最有效的方法是什么,然后开始编码。用纸和笔,有创意。不要选择简单的方法。同样,这不是其他人会告诉您如何编写代码的地方。如果您有一个您认为将来可能对其他人有所帮助的问题,请编辑并重新发布。否则我会建议你删除这个问题。
  • 我不同意我的要求是关于编码的,事实上我可以处理我的代码,我的数据库让我有些头疼,我的问题是关于非常高级的概念和最佳实践。
  • 忽略索引问题(暂时),让我们看看DELETE 的样子。

标签: mysql performance indexing


【解决方案1】:

有多种技术可以处理“更新”的一百万行。

  1. 如果是完全替换,建一个新表,然后交换(RENAME TABLE)。

  2. 如果“更新”需要INSERT或者UPDATE...也就是有些行是新的,有些需要小修改,那么看INSERT ... ON DUPLICATE KEY UPDATE ...

  3. 1234563 CREATE 并填充 (LOAD DATA?) 更改集;执行多表DELETE;执行INSERT ... SELECT .. LEFT JOIN .. 以复制“新”行;做 IODKU 或多表 UPDATEUPDATEs。我讨论了其中的一些here

我并不完全了解您需要做什么。这些技术中哪一个听起来很接近?你能把你的要求改写成更接近我的建议吗?也许那时我可以更具体。包含SHOW CREATE TABLE 并指出在决定插入/删除/更新内容方面发挥作用的列可能会很有用。

而且,是的,INDEXesDELETEsUPDATEs 很有用。

【讨论】:

  • 我已经添加了 show create 表。相关列是进行匹配的 a、b、c、d 列,所有匹配的列可以极其精确地定义我要删除的地图数据组。列 px 和 pz 与范围匹配(它们表示对象在地图上的位置)。我担心的是能够删除由 a,b,c,d 定义的整个对象范围,然后 db 将在 px 和 pz 范围内搜索。顺便说一句,它永远不会完全替换或更新,数据将被插入或删除。
  • 你会使用px = constant吗?或px BETWEEN .. and ..?
  • 我会测试范围,所以它将是 px >= "left limit" 和 px
  • 没有索引可以同时处理两个范围。索引是一维的;听起来你有一个二维问题。有关 2D 世界(但不是 3D 或更高版本)的性能,请参阅mysql.rjweb.org/doc.php/latlng
  • 什么意思? px 和 pz 不会被索引,只有 a,b,c,d 会。如果我通过指定 a、b、cd 进行选择,那么我猜数据库将以经典方式扫描所有过滤后的结果以获取 px 和 pz 值。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
相关资源
最近更新 更多