我目前有一个摘要表来跟踪我的用户的帖子计数,我在该表上运行SELECT以按计数排序,例如WHERE count > 10
。现在我知道在WHERE子句中使用的列的索引可以加快速度,但由于这些字段也会经常更新,索引会提供更好还是更差的性能?
答案 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可用的索引以及它选择的索引和(以某种复杂方式排序)为什么。
答案 1 :(得分:0)
索引通常以更差的插入,更新和删除性能为代价提供更好的读取性能。通常权衡取舍取决于索引的宽度和表中已存在的索引数。在你的情况下,我敢打赌,索引的整体性能(读写)仍然会比没有好,但你需要运行测试才能确定。
答案 2 :(得分:0)
它将提高读取性能并恶化写入性能。如果表格是MyISAM并且你有很多人在很短的时间内发帖,你可能会遇到MySQL等待锁定的问题,最终导致崩溃。
答案 3 :(得分:0)
没有尝试就无法真正了解它。很大程度上取决于读取与写入的比率,存储引擎,磁盘吞吐量,各种MySQL调整参数等。您必须设置类似于生产并在之前和之后运行的模拟。
答案 4 :(得分:0)
我认为在添加索引后写入性能不太可能是一个严重的问题。
但请注意,如果索引不够有选择性,则无论如何都不会使用该索引 - 如果超过10%的用户拥有count > 10
,那么最快的查询计划可能就是不使用索引而只是扫描整个表格。