小型“快速移动”表上的mysql索引性能

时间:2010-01-19 18:22:27

标签: mysql performance indexing

我们有一个用作队列的表。条目不断被添加,并不断更新,然后被删除。虽然我们可能会增加3个条目/秒,但表永远不会增长到几百行。

要从表格中获取条目,我们正在进行简单的选择。

SELECT * FROM queue_table WHERE some_id = ?

我们正在讨论在some_id上​​添加索引。我认为我们添加和删除行的小尺寸和速度会说不,但通常情况下,似乎我们应该有一个索引。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

如果您正在使用InnoDB(您应该使用此类表格)并且同时访问该表,那么您一定要创建索引。

执行DML次操作时,InnoDB会锁定它扫描的所有行,而不仅仅是那些符合WHERE子句条件的行。

这意味着没有索引,就像这样的查询:

DELETE
FROM    mytable
WHERE   some_id = ?

必须执行全表扫描并锁定所有行。

这会杀死所有并发(即使线程访问不同的some_id,它们仍然必须等待彼此),甚至可能导致死锁。

每秒3次交易,没有索引应该是问题,所以只需创建它。

答案 1 :(得分:0)

可以肯定的是,需要使用这两种技术的基准测试。

但一般来说,如果访问权限为50%读取和50%写入,则更新索引的代价可能不值得。但是,如果行数增加,则会对读取和写入性能进行加权,以便使用索引。

答案 2 :(得分:0)

确定的唯一方法是在实际/实际条件下做一些基准测试;例如,测量每个查询所花费的时间,并且:

  • 一天,每次运行查询时收集该信息 - 没有索引
  • 和另一天,使用索引完全相同。

对于有几百行进行批量和插入/删除以及选择/更新的表,差别不应该那么大,所以我认为你可以在生产环境中进行测试(并且在实际条件下) 没有太大的危险。


是的,我知道,生产测试很糟糕;但在这种情况下,这是确定的最佳方式:在测试环境中这些条件可能难以复制......