我如何让MySql在加入时使用最有效的索引?

我如何让MySql在加入时使用最有效的索引?,mysql,Mysql,我有一个包含两个表的数据库-产品和项目。这里有一个1:M关系,其中items.product\u id指向products.id 我有以下疑问: SELECT products.* FROM products ORDER BY created_at desc LIMIT 1 它的性能很好。但是,现在我将项目加入其中: SELECT products.* FROM products JOIN items ON items.product_id = products.id GROUP B

我有一个包含两个表的数据库-
产品
项目
。这里有一个1:M关系,其中
items.product\u id
指向
products.id

我有以下疑问:

SELECT products.* FROM products 
ORDER BY created_at desc 
LIMIT 1
它的性能很好。但是,现在我将项目加入其中:

SELECT products.* 
FROM products 
JOIN items ON items.product_id = products.id 
GROUP BY id 
ORDER BY created_at desc 
LIMIT 1
查询运行速度慢得令人无法接受(以当前数据量计算大约5秒)

解释产出:

mysql> explain SELECT products.* FROM products GROUP BY id  ORDER BY created_at desc  LIMIT 1 \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: products
         type: index
possible_keys: PRIMARY,index_products_on_first_created_at
          key: index_products_on_first_created_at
      key_len: 5
          ref: NULL
         rows: 1
        Extra: NULL
以及:

因此,基本上,当我加入(并分组)时,MySql不再使用在上创建的的索引,从而破坏了正确排序结果的能力。我试图用
id
+
created\u在
创建一个组合索引,但查询计划忽略了它。例如:

alter table products add index foobar (id,created_at) ;

如何使此查询执行得更好?

它没有使用索引,因为在第二个查询中,您没有对products中的列进行排序,而是对结果集进行排序。排序是在选择后完成的。尽管加入了它,但您并没有使用
表。加入的目的是什么?也许有更好的办法来解决你的需要?安德鲁:我相信你是对的,但是我能做些什么呢?艾格亚尔:嗯,我简化了这篇文章的查询。事实上,where子句中有一些条件,但这似乎不是问题的核心。@troelskn:没有大量的信息,很难说。但有一件事很容易尝试,那就是为要加入的列编制索引。您在实际查询中有任何限制吗?
alter table products add index foobar (id,created_at) ;