在我的脚本中,我有很多SQL WHERE子句,例如:
SELECT * FROM cars WHERE active=1 AND model='A3';
SELECT * FROM cars WHERE active=1 AND year=2017;
SELECT * FROM cars WHERE active=1 AND brand='BMW';
我在同一个表上使用不同的SQL子句,因为我需要不同的数据。
我想在桌面车上设置索引键,但我不知道该怎么做。我应该为每一列(活动,型号,年份,品牌)设置单独的键,还是应该为组(活动,模型和活动,年份和活动,品牌)设置键?
答案 0 :(得分:1)
WHERE a=1 AND y='m'
最好由 中的INDEX(a,y)
处理。最佳索引集是这样的几对。但是,我不建议使用多个索引。尝试将其限制为用户实际进行的查询。
INDEX(a,b,c,d)
:
WHERE a=1 AND b=22 -- Index is useful
WHERE a=1 AND d=44 -- Index is less useful
只有"左列"使用索引。因此,第二种情况使用a
,但因为b
中不存在WHERE
而停止。
您可能也想要(active, year, model)
。这种组合适用于active AND year
,active AND year AND model
,但不是 active AND model
(但没有year
)。
有关创建索引的更多信息:http://mysql.rjweb.org/doc.php/index_cookbook_mysql
由于model
意味着make
,因此将这两者放在同一个复合索引中几乎没用。
year
不是很有选择性,用户可能需要一定年限。这使得很难在year
上获得有效的索引。
你会有多少行?如果它是数百万,我们需要更加努力以避免性能问题。我倾向于this,但只是因为查找会更紧凑。
答案 1 :(得分:0)
当我们想要查询一个列时,我们使用单个索引,当你在同一个where子句中有多个条件时,在你的情况下和多个组索引一样。
转到单个索引。
有关更详细的说明,请参阅此文章:https://www.sqlinthewild.co.za/index.php/2010/09/14/one-wide-index-or-multiple-narrow-indexes/