Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当一个表有多个索引时,Mysql索引是如何处理的?_Mysql_Performance_Indexing - Fatal编程技术网

当一个表有多个索引时,Mysql索引是如何处理的?

当一个表有多个索引时,Mysql索引是如何处理的?,mysql,performance,indexing,Mysql,Performance,Indexing,样本表 字段0:否(主键) 字段1:标题 字段2:说明 字段3:类别1(索引) 字段4:类别2(索引) 字段5:类别3(索引) 字段6:类别4(索引) 字段7:类别5(索引) 以上是我将在我的网站上使用的示例,类别字段各有一个索引 如果我执行下面的命令 select * from table where category1=1 and category2=2 and category3=3 and category4=4 and category5=5 将一个表只有一个类别字段与该表有许多类似

样本表

  • 字段0:否(主键)
  • 字段1:标题
  • 字段2:说明
  • 字段3:类别1(索引)
  • 字段4:类别2(索引)
  • 字段5:类别3(索引)
  • 字段6:类别4(索引)
  • 字段7:类别5(索引)
  • 以上是我将在我的网站上使用的示例,类别字段各有一个索引

    如果我执行下面的命令

    select * from table where category1=1 and category2=2 and category3=3 and category4=4 and category5=5
    
    将一个表只有一个类别字段与该表有许多类似于上表的类别进行比较。哪一个更好

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


    因此,我想通过带有索引成本、样本数据、计算过程或其他信息的“样本”获取一些信息,这将有助于理解索引计算过程一般来说,如果您有多个WHERE约束的查询,最好的索引是包含所有受约束字段的复合索引-在您的情况下,它将是
    上的索引(category1、category2、category3、category4、category5)

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


    无论如何,请始终尝试运行EXPLAIN ANALYZE以了解查询计划器的想法以及它将选择的索引。如果您有顺序扫描,这可能是您担心的原因,但并非总是如此(例如,使用低选择性索引可能不值得规划者使用)

    您可以使用解释扩展查询短语来分析执行引擎将做些什么。最好的情况是MySQL将使用索引合并。这意味着它将通过自己的索引选择每个选项,然后在没有任何索引帮助的情况下合并结果集。通常,复合索引的速度要快得多,但这可能取决于记录的数量和使用场景(记录的高周转率或低周转率)。

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

    例如,您可能有类似您的查询:

    SELECT * FROM table WHERE category1=1 AND category2=2 AND category3=3 AND category4=4 AND category5=5
    
    可以使用包含类别1、类别2、类别3、类别4和类别5的组合索引,也可以使用仅包含类别1和类别2的组合索引。优化器将在运行时决定使用哪一个

    另一个常见的例子是:

    SELECT * FROM table WHERE category1=1 OR category2=2
    
    查询优化器只能对category1或category2使用索引,但不能同时对两者使用!至少这是mysql解释返回的结果。其他数据库可能会并行运行这两个选择,并将两个结果合并并删除重复项

    在开始添加大量索引之前,请记住它们产生的开销。如果您的读访问权限比写访问权限多得多,那么可能会解决这个问题。但是,如果您还有许多insert或update操作,则每次都需要调整索引,这会导致额外的负载并增加查询执行时间


    对于您的后续操作,我推荐Mysql这一章

    尝试在SELECT前面进行解释,Mysql将向您解释发生了什么以及该查询使用了哪个索引:o)如果使用完全错误的表设计,您为什么会担心性能?如果您的表与某些类别有1:many关系,那么您不会将其硬编码到列中,而是创建另一个表,将您的实体链接到其类别。然后,你可以开始担心性能,当基金会是坚实的。我也发现令人失望的是,这么多的答案将指向人对代码>解释< /代码>时,显然缺乏知识的关系设计。谢谢!!!你所有的答案!!首先,我将使用EXPLAIN和secondary测试一个查询,我将创建一个表,这样将有三个表。(1) 目录表,(2)目录表,(3)静态表。它们是相互关联的。(1) ,(2)是这样关联的“1:N”,(3),(2)是这样关联的“1:N”,在完成上述测试后,我将对这项工作的结果进行评论。谢谢你们!!!!!