这就是我所拥有的:
table content : cat_id product_id data1 data2 etc.
这些类别显然不是唯一的。
产品ID是独一无二的。
2 queries :
1 -- SELECT * WHERE cat_id = :cat - must be as quick as possible
2 -- SELECT * WHERE product_id = :prodId
In second select, I can add : AND cat_id = :cat
什么效率更高?
有关信息,我将在每个类别和大量类别(比如3000)中拥有大约20种产品 - 并且(因为它在表中是独一无二的)一个产品只属于一个类别 - 事实上,这不是真的猫和产品,这是为了简单的解释;)
谢谢!
答案 0 :(得分:5)
没有主键的数据库只有一半打扮,根据你的说法,product_id是主键的理想候选者,所以我们选择它。主键将在
中使用SELECT * WHERE product_id = :prodId
and cat_id = :cat_id
是否成为查询的一部分无关紧要,除非您有cat_ids
个与product_id
相关联的数千{。}}。
然后在cat_id上选择一个索引。这将用于
SELECT * WHERE cat_id = :cat
如果数据的基数良好,这将非常快。这意味着表中有cat_id
的广泛分布。 cat_id
的索引不会在第一个查询中使用。因此,您有两个不同的索引,并且可以预期两个查询都非常快。
自[cat_id+product_id] != [product_id+cat_id]
以来,在索引方面,如果只有一个复合索引,那么另一个将很慢。
例如,假设我们现在有一个复合索引(cat_id,product_id) 以下查询无法使用此索引。
SELECT * FROM tablename WHERE product_id = :prodId
但这两个查询都可以使用(cat_id,product_id)索引
SELECT * FROM tablename WHERE cat_id = :cat_id and product_id = :prodId
SELECT * FROM tablename WHERE cat_id = :catId
总结一下。选择1和2.但是如果cat_id
的数量很小或者每个product_id
都有很多cat_ids,请选择4,但要确保主键也已到位。
答案 1 :(得分:1)
如果这些只是 两个查询:
SELECT * FROM tablename WHERE cat_id = :cat_id and product_id = :prodId
SELECT * FROM tablename WHERE cat_id = :cat_id
和您还有其他方法可以确保product_id
为UNIQUE
,那么您只需要 :
PRIMARY KEY(cat_id, product_id)
最适合 SELECTs
。
优于INDEX(cat_id)
,因为(1)辅助密钥必须使用PK查找完成工作,(2)所有cat行都相邻,从而更有效。
如果product_id
实际上是AUTO_INCREMENT
,则添加
INDEX(product_id)
不,您不需要说UNIQUE
(除非您倾向于故意尝试插入重复的product_ids
)。 AI要求的唯一内容是id首先出现在某个索引中,这样每当mysqld重新启动时它都可以相当于SELECT max(id)
。
无论表格大小如何,我的建议都适用。
WHERE
中的子句顺序不重要。
JOINs
不要要求。 JOIN
上的PRIMARY KEY
比使用辅助键的效率稍高一些,这比非索引列更有效(但仍然可能)。