这个字段需要索引吗?

时间:2011-09-28 21:57:20

标签: mysql indexing

我目前有一个摘要表来跟踪我的用户的帖子计数,我在该表上运行SELECT以按计数排序,例如WHERE count > 10。现在我知道在WHERE子句中使用的列的索引可以加快速度,但由于这些字段也会经常更新,索引会提供更好还是更差的性能?

5 个答案:

答案 0 :(得分:1)

如果你有像

这样的查询
SELECT count(*) as rowcount
FROM table1
GROUP BY name

然后你不能把一个索引放在计数上,你需要在group by字段上放一个索引。

如果您有一个名为count

的字段

然后在此查询中放入索引可能会加快查询速度,它也可能没有任何区别:

SELECT id, `count`
FROM table1
WHERE `count` > 10

count上的索引是否会加快查询速度取决于行满足where子句的百分比。如果超过30%,MySQL (或任何SQL)将拒绝使用索引。
它只会固执地坚持进行全表扫描。 (即读取所有行)
这是因为使用索引需要读取2个文件(1个索引文件,然后是真实表文件和实际数据) 如果您选择了很大比例的行,那么读取额外的索引文件是不值得的,只是按顺序读取所有行会更快。

如果只有几行通过这些集合,使用索引会加快此查询的速度很多

了解您的数据

使用explain select将告诉您MySQL可用的索引以及它选择的索引和(以某种复杂方式排序)为什么。

请参阅:http://dev.mysql.com/doc/refman/5.0/en/explain.html

答案 1 :(得分:0)

索引通常以更差的插入,更新和删除性能为代价提供更好的读取性能。通常权衡取舍取决于索引的宽度和表中已存在的索引数。在你的情况下,我敢打赌,索引的整体性能(读写)仍然会比没有好,但你需要运行测试才能确定。

答案 2 :(得分:0)

它将提高读取性能并恶化写入性能。如果表格是MyISAM并且你有很多人在很短的时间内发帖,你可能会遇到MySQL等待锁定的问题,最终导致崩溃。

答案 3 :(得分:0)

没有尝试就无法真正了解它。很大程度上取决于读取与写入的比率,存储引擎,磁盘吞吐量,各种MySQL调整参数等。您必须设置类似于生产并在之前和之后运行的模拟。

答案 4 :(得分:0)

我认为在添加索引后写入性能不太可能是一个严重的问题。

但请注意,如果索引不够有选择性,则无论如何都不会使用该索引 - 如果超过10%的用户拥有count > 10,那么最快的查询计划可能就是不使用索引而只是扫描整个表格。