带有更多列的表上的MySQL索引键

时间:2018-01-08 12:54:59

标签: mysql indexing

在我的脚本中,我有很多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子句,因为我需要不同的数据。

我想在桌面车上设置索引键,但我不知道该怎么做。我应该为每一列(活动,型号,年份,品牌)设置单独的键,还是应该为组(活动,模型和活动,年份和活动,品牌)设置键?

2 个答案:

答案 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 yearactive 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/