0

样品表

  1. 字段 0:否(PK)
  2. 字段 1:标题
  3. 字段 2:描述
  4. 字段 3:类别 1(索引)
  5. 字段 4:类别 2(索引)
  6. 字段 5:类别 3(索引)
  7. 字段 6:类别 4(索引)
  8. 字段 7:类别 5(索引)

以上是我将在我的网站上使用的示例,每个类别字段都有一个索引。

如果我像下面这样执行这个命令

select * from table where category1=1 and category2=2 and category3=3 and category4=4 and category5=5

比较一个表只有一个类别字段,该表有很多类别,如上表。哪一个更好?

我想当然,只有一个类别字段的表是不错的选择。但我真的不知道关于指数计算过程的深入信息。我必须向我的老板解释他们之间的不同之处!!!!

所以我想用“样本”获取一些信息,包括指数成本、样本数据、计算过程或其他有助于了解指数计算过程的信息

4

3 回答 3

0

正如 mvp 之前已经写过的,使用EXPLAIN语法来查看查询优化器将如何处理您的查询。一般来说,mysql 对您访问的每个表使用一个索引来获取您要查找的数据。优化器还尝试找到具有最高选择性的一个,以防可能存在多个索引。

例如,您可能有像您这样的查询:

SELECT * FROM table WHERE category1=1 AND category2=2 AND category3=3 AND category4=4 AND category5=5

可以使用包含 category1、category2、category3、category4 和 category5 的组合索引,也可以使用仅包含 category1 和 category2 的组合索引。优化器将在运行时决定采用哪一个。

另一个常见的例子是:

SELECT * FROM table WHERE category1=1 OR category2=2

查询优化器只能对 category1 或 category2 使用索引,但不能同时使用两者!至少这是 mysql EXPLAIN 返回的。其他数据库可能会同时运行这两个选择,并简单地连接两个结果并删除重复项。

在开始添加大量索引之前,请记住它们产生的开销。如果您的读取访问权限多于写入访问权限,则可能会成功。但是如果您还有很多插入或更新操作,则每次都需要调整索引,这会导致额外的负载并增加查询执行时间。

对于您的跟进,我推荐这个 Mysql 章节MySQL 如何使用索引

于 2012-10-23T09:16:54.957 回答
0

一般来说,如果您有多个 WHERE 约束的查询,最好的索引是包含所有受约束字段的复合索引 - 在您的情况下,它将是索引(category1, category2, category3, category4, category5)

然而,在实践中,拥有如此多的复合索引真的很浪费。此外,索引仅在具有高选择性时才有用。例如,如果您的字段可能具有相等概率的值 0 或 1(选择性 1/2),则几乎总是不值得在此类字段上创建索引,甚至不值得将该字段包含在复合索引中。

无论如何,请始终尝试运行 EXPLAIN ANALYZE 以了解查询规划器在想什么以及它将选择哪个索引。如果您有顺序扫描,可能有理由担心,但并非总是如此(例如,对于计划者来说,使用低选择性索引可能不值得)

于 2012-10-23T08:40:56.130 回答
0

您可以使用EXPLAIN EXTENDED query-phrase分析执行引擎将执行的操作。最好的情况是 MySQL 将使用索引合并。这意味着它将通过自己的索引选择每个选项,然后在没有任何索引帮助的情况下合并结果集。通常,复合索引要快得多,但这可能取决于记录的数量和使用场景(记录的高或低周转率)。

于 2012-10-23T08:48:55.177 回答