我如何让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) ;