简单的问题。假设我有一个用户表和一个汽车表。 cars表有 user_id , make ,模型,我总是使用user_id查询其数据:
SELECT * FROM cars WHERE user_id = 123 AND make = 'honda'
SELECT * FROM cars WHERE user_id = 123 AND model = 'accord'
假设我总是使用user_id查询cars表,最好是添加两个多列索引[user_id,make]和[user_id,model](可能还有更多用于其他列),或者每个索引添加一个单列索引user_id,make和model列?
令我困惑的是,有几个多列索引都是以相同的foreign_key开头的想法。似乎最适合我的查询,但不确定它对数据库的正确/有效/浪费。
答案 0 :(得分:2)
这个答案考虑的是什么是最正确/最有效/最浪费的"在数据库中。
假设我总是使用user_id查询cars表,
那么,您对数据的处理方式或访问方式与数据库设计和整体性能无关。它仅与该单个查询相关。
最好是为每个user_id,make和model列添加两个多列索引[user_id,make]和[user_id,model](可能更多用于其他列),还是单列索引?
单列索引是多余的,非执行者,它不会产生任何收益。
首先,与你的问题分开,PK应该是:
( user_id, make, model )
因为(没有看到表的完整DDL),这是提供行唯一性的唯一方法,这是关系数据库中所要求的。即使添加了属性列,也不需要其他索引。
其次,对于您所描述的查询,PK索引是您唯一需要的索引。
- 令我困惑的是,有几个多列索引都是以相同的foreign_key开头的。*
是的,这应该引发警报。并不是说它们都以相同的FK开头,而是以相同的列开头。具有最大列集的索引使其他列冗余。