索引不一定能提高性能。为了更好地了解正在发生的事情,如果您explain
为不同的查询包括了,这将有所帮助。
我最好的猜测是您有一个索引,id_state
甚至id_state, id_mp
可以用来满足该where
子句。如果是这样,则不order by
使用的第一个查询将使用此索引。它应该很快。即使没有索引,这也需要对orders
表中的页面进行顺序扫描,这仍然可以非常快。
然后当您添加索引时creation_date
,MysqL决定使用该索引代替order by
。这需要读取索引中的每一行,然后获取相应的数据页以检查where
条件并返回列(如果存在匹配项)。该读取效率极低,因为它不是按“页面”顺序,而是按索引指定的顺序。随机读取可能效率很低。
更糟糕的是,即使您有一个limit
,您仍然必须读取 整个 表,因为需要整个结果集。尽管您已经保存了38条记录的排序,但是您创建了一个效率非常低下的查询。
顺便说一句,如果orders
表无法容纳在可用内存中,这种情况将变得更加严重。然后,您有一个称为“崩溃”的条件,其中每个新记录都倾向于生成一个新的I / O读取。因此,如果一个页面上有100条记录,则该页面可能必须被读取100次。
通过在上添加索引,可以使所有这些查询的运行速度更快orders(id_state, id_mp, creation_date)
。该where
子句将使用前两列,而order by
则将使用最后两列。