我们有一个用作队列的表。条目不断地被添加、不断地更新,然后被删除。尽管我们可能每秒添加 3 个条目,但表的数量永远不会超过几百行。
为了从表中获取条目,我们进行了一个简单的选择。
SELECT * FROM queue_table WHERE some_id = ?
我们正在讨论在 some_id 上添加索引。我认为我们添加和删除行的小尺寸和速度会说不,但按照惯例,我们似乎应该有一个索引。
有什么想法吗?
最佳答案
如果您使用InnoDB
(您应该拥有此类表)并且该表是并发访问的,那么您绝对应该创建索引。
执行DML
操作时,InnoDB
会锁定它扫描的所有行,而不仅仅是那些与WHERE
子句条件匹配的行。
这意味着没有索引,查询如下:
DELETE
FROM mytable
WHERE some_id = ?
必须进行全表扫描并锁定所有行。
这会杀死所有并发(即使线程访问不同的 some_id
,它们仍然必须互相等待),甚至可能导致死锁。
每秒 3
笔交易,没有索引应该是问题,所以只需创建它即可。
关于 "fast-moving"小表上的 mysql 索引性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2095918/