样本表
以上是我将在我的网站上使用的示例,类别字段各有一个索引。
如果我按照以下命令执行
select * from table where category1=1 and category2=2 and category3=3 and category4=4 and category5=5
要比较一个表只有一个类别字段,表格上面有很多类别,如上表所示。哪一个更好?
我发现当然,只有一个类别字段的表格是不错的选择。 但我真的不知道有关索引计算过程的深层信息。 我必须向老板解释一下他们之间的不同之处!!!!
所以我希望获得一些带有索引成本,样本数据,计算过程或其他的“样本”的信息,这将有助于理解索引计算过程
答案 0 :(得分:0)
通常,如果您有多个WHERE约束的查询,那么要获得的最佳索引是复合索引,其中包含受约束的所有字段 - 在您的情况下,它将是(category1, category2, category3, category4, category5)
上的索引
然而,在实践中,拥有如此多的复合指数真的很浪费。此外,索引仅在具有高选择性时才有用。例如,如果您的字段可能具有值0或1且概率相等(选择性1/2),则几乎总是不值得在此类字段上创建索引,甚至在复合索引中包含此字段。
无论如何,总是尝试运行EXPLAIN ANALYZE来了解查询规划器的想法以及它将选择哪个索引。如果您有顺序扫描,可能需要担心,但并非总是如此(例如,对于规划人员而言,使用低选择性指数可能不值得)
答案 1 :(得分:0)
您可以使用 EXPLAIN EXTENDED查询词组 分析执行引擎的操作。最好的情况是MySQL将使用索引合并。这意味着它将通过它自己的索引选择每个选项,然后在没有任何索引帮助的情况下合并结果集。通常,复合索引要快得多,但这可能取决于记录的数量和使用情况(记录的高或低周转率)。
答案 2 :(得分:0)
正如之前由mvp编写的那样,使用EXPLAIN语法来查看查询优化器如何处理您的查询。通常,mysql使用每个表访问一个索引来获取您要查找的数据。优化器还会尝试找到具有最高选择性的那个,以防有多个索引可能。
E.g。你可能有像你这样的查询:
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章节How MySQL uses indexes