我有一个运行非常缓慢的查询。正在查询的表有大约 100k 条记录,并且在 where 子句中使用的大多数列上没有索引。我刚刚在这些列上添加了索引,但查询并没有变得更快。
我认为这是因为当一个列被索引时,它的值是在插入时写入索引中的。在添加了所有这些记录之后,我现在才添加索引。那么有没有办法在表上“重新运行索引”?
编辑
这是查询和解释结果:
奇怪的是,当我复制查询并直接在我的 SQL 管理器工具中运行时,它运行得非常快,所以问题可能出在我的应用程序代码中,而不是查询本身。
这是一个非常普遍的问题。
使用 MySQL 解释http://dev.mysql.com/doc/refman/5.0/en/using-explain.html
当您在 SELECT 语句之前加上关键字 EXPLAIN 时,MySQL 会显示来自优化器的有关查询执行计划的信息。也就是说,MySQL 解释了它将如何处理该语句,包括有关表如何连接以及以何种顺序连接的信息。
使用这些结果...验证您创建的索引是否按您预期的方式运行。
如果没有,您将需要调整索引,直到它按预期工作。
您可能想创建一个新表,创建索引,然后在测试时将旧表中的所有元素插入到新表中。这比一百万次删除和重新添加索引要容易。
Mysql 保持一致的索引。不管是先添加数据、先添加索引,还是随时更改数据。将产生相同的最终索引(假设最终数据和索引类型相同)。
您的慢查询不是由稍后添加索引引起的。还会有别的原因。