MySQL在索引列上的select查询

5

我对MySQL还不熟悉,有几个问题一直找不到答案。这是我想做的:

我有一个包含5列的数据库:id、c1、c2、c3、c4 id是PRIMARY KEY 每行在c1、c2、c3、c4上都是唯一的(如果有术语可以让你们知道,请告诉我:))

我需要能够在表中搜索现有行,所以我想在c1上放置一个INDEX,这将把行数从可能达到10,000(最多100,000)减少到几个。我的问题是:

  1. 你估计在性能受益之前需要多少行才能“值得”使用索引?粗略的和轶事式的回答都可以。

  2. 我需要任何特殊的语法来告诉MySQL使用INDEX吗?现在我正在执行“SELECT id FROM table WHERE c1 ='blah' AND c2 ='blah' AND c3 ='blah' AND c4 ='blah'”,我不确定INDEX是否有助于查询。

  3. 欢迎提出其他更好的查询表格的建议,但请记住我是新手! :)

提前感谢!


FYI,“复合键”是使用多个列的键。 - Wiseguy
1个回答

2
我猜索引是否“值得”取决于查询需要运行的速度。对于只有数百条记录的情况,无论如何都会很快。但无论如何,索引应该更快,因为您避免了不得不读取所有(在某些情况下是任何)磁盘上的记录。即使没有索引的查询需要0.02秒,使用索引可能会在0.0004秒内执行。一旦进入数千行,您肯定需要一个索引。因此,无论有多少行,您都可以始终在JOIN或WHERE子句中使用索引。

MySQL 应该使用您的索引。您可以通过运行EXPLAIN查询来检查。(只需在查询前面添加EXPLAIN,例如EXPLAIN SELECT * FROM...。)它将显示正在使用的索引(如果有)。请记住,您必须按组合索引中指定的顺序使用列。因此,如果您的索引是c1-c2-c3-c4,则不能仅使用c4而不使用其他列。

因此,SELECT * FROM table WHERE c1 = 'foo' AND c4 = 'bar'会使用您的索引来匹配c1 = 'foo',但无法使用它来匹配c4 = 'bar',因为您没有使用c2c3。由于您在索引中使用了所有四个列,所以应该对它们全部使用索引。明白吗?

EXPLAIN正是我需要的,可以看到发生了什么。顺便说一下,MySQL正在使用索引,我用了几个不同的select语句进行了测试,以查看它的行为,所以我应该没问题了!感谢您的帮助!! - neurotik
@neurotic:你在c1上有索引还是在(c1,c2,c3,c4)上有索引? - ypercubeᵀᴹ
@ypercube 很好的问题。我最初理解为(c1,c2,c3,c4)上有唯一索引,并据此编写了我的答案,但在重新阅读问题后,我并不完全确定。我想我们会找到答案的。 - Wiseguy
@neurotik 哦。 c2c3c4 有索引吗?如果没有,为什么没有?您总是希望在索引中使用 WHERE条件或 JOIN 中使用的列。如我的答案所解释的那样,如果查询始终具有对 c1c2c3c4 的条件,则在 (c1,c2,c3,c4) 上的一种组合索引比四个单独的索引更好。 - Wiseguy
哦,我明白你的问题了...我只索引c1的原因是因为99%的情况下它能够自行确定唯一的行,即使它不能,它也会将选择范围缩小到2或3行,所以我认为在这种情况下没有必要将索引包括c2、c3、c4。不过我可以理解为什么大多数时候你想要对所有4列进行索引。 - neurotik
现在我重新阅读我刚刚写的内容,意识到这个表中存储了很多冗余信息,所以我可能需要重新考虑设计,但至少我的问题得到了回答! :) - neurotik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接