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



