【问题标题】:MySQL select on indexed columnsMySQL 选择索引列
【发布时间】:2011-10-16 09:14:27
【问题描述】:

我是 MySQL 新手,有几个问题我无法找到任何相关信息。这是我想要做的:

我有一个包含 5 列的数据库:id、c1、c2、c3、c4 id 是主键 每行在 c1、c2、c3、c4 中都是唯一的(如果你们为此使用了术语,请告诉我:))

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

  1. 在索引的性能优势变得“值得”之前,您估计有多少行?棒球场/轶事答案很好。

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

  3. 欢迎任何其他关于查询表的更好方法的建议,请记住我是新手! :)

提前致谢!

【问题讨论】:

标签: mysql select indexing


【解决方案1】:

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

MySQL应该使用你的索引。您可以通过运行EXPLAIN 查询来检查。 (只需在查询前添加EXPLAIN,如EXPLAIN SELECT * FROM...。)它将显示正在使用的索引,如果有的话。请记住,您必须按照在composite index 中指定的顺序使用这些列。所以如果你的索引是c1-c2-c3-c4,你就不能只使用c4而不使用其他列。

所以,SELECT * FROM table WHERE c1 = 'foo' AND c4 = 'bar' 会将您的索引用于c1 = 'foo',但它不能将它用于c4 = 'bar',因为您没有使用c2c3。由于您在索引中使用了所有四列,因此应该对所有四列都使用索引。有意义吗?

【讨论】:

  • EXPLAIN 正是我需要了解的内容。仅供参考,MySQL 正在使用索引,我用几个不同的 select 语句对其进行了测试,以查看它的行为,所以我应该很高兴!谢谢你的帮助!!
  • @neurotic: 你有c1 的索引或(c1,c2,c3,c4) 的索引吗?
  • @ypercube 好问题。我最初理解(c1,c2,c3,c4) 上有一个唯一索引并因此写下了我的答案,但在重读这个问题后我并不完全确定。我想我们会发现的。
  • @neurotik 哦。您有c2c3c4 的索引吗?如果不是,为什么不呢?您总是希望在索引中使用WHERE 条件或JOINs 中的列。正如我在回答中所解释的那样,如果您的查询始终具有c1c2c3c4 的条件,那么(c1,c2,c3,c4) 上的一个组合索引比四个单独的索引更好。
  • 哦,我明白你在问什么......我只有 c1 索引的原因是因为 99% 的时间它能够自行确定唯一的行,即使它可以't,它会将选择范围缩小到 2 或 3 行,所以我认为在这种情况下,索引不需要包含 c2、c3、c4。我可以理解为什么您大部分时间都希望索引所有 4 列。
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多