我们有一个用作队列的表。条目不断被添加,并不断更新,然后被删除。虽然我们可能会增加3个条目/秒,但表永远不会增长到几百行。
要从表格中获取条目,我们正在进行简单的选择。
SELECT * FROM queue_table WHERE some_id = ?
我们正在讨论在some_id上添加索引。我认为我们添加和删除行的小尺寸和速度会说不,但通常情况下,似乎我们应该有一个索引。
有什么想法吗?
答案 0 :(得分:3)
如果您正在使用InnoDB
(您应该使用此类表格)并且同时访问该表,那么您一定要创建索引。
执行DML
次操作时,InnoDB
会锁定它扫描的所有行,而不仅仅是那些符合WHERE
子句条件的行。
这意味着没有索引,就像这样的查询:
DELETE
FROM mytable
WHERE some_id = ?
必须执行全表扫描并锁定所有行。
这会杀死所有并发(即使线程访问不同的some_id
,它们仍然必须等待彼此),甚至可能导致死锁。
每秒3
次交易,没有索引应该是问题,所以只需创建它。
答案 1 :(得分:0)
可以肯定的是,需要使用这两种技术的基准测试。
但一般来说,如果访问权限为50%读取和50%写入,则更新索引的代价可能不值得。但是,如果行数增加,则会对读取和写入性能进行加权,以便使用索引。
答案 2 :(得分:0)
确定的唯一方法是在实际/实际条件下做一些基准测试;例如,测量每个查询所花费的时间,并且:
对于有几百行进行批量和插入/删除以及选择/更新的表,差别不应该那么大,所以我认为你可以在生产环境中进行测试(并且在实际条件下) 没有太大的危险。
是的,我知道,生产测试很糟糕;但在这种情况下,这是确定的最佳方式:在测试环境中这些条件可能难以复制......