Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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上的多字段索引中拾取字段_Sql_Mysql - Fatal编程技术网

在MySQL上的多字段索引中拾取字段

在MySQL上的多字段索引中拾取字段,sql,mysql,Sql,Mysql,我有一个我想优化的MySQL查询: SELECT min(`topic_id`) FROM `gallery_topics` where `topic_id` > 11 AND `topic_poster` = 5 AND `topic_status` = 0 我想添加一个包含多个字段的索引以优化此查询,因此我添加了一个由作者命名为previous_的键,并按以下顺序添加了这三个键: 主题id 主题海报 专题组状态 我对这个查询进行了解释,希望解释查询会告诉我查询使用了我以前的作者索引。

我有一个我想优化的MySQL查询:

SELECT min(`topic_id`) FROM `gallery_topics` where `topic_id` > 11 AND `topic_poster` = 5 AND `topic_status` = 0
我想添加一个包含多个字段的索引以优化此查询,因此我添加了一个由作者命名为previous_的键,并按以下顺序添加了这三个键:

  • 主题id
  • 主题海报
  • 专题组状态
  • 我对这个查询进行了解释,希望解释查询会告诉我查询使用了我以前的作者索引。但是,EXPLAIN报告查询使用用户开始时间索引,该索引使用以下两个字段:1。主题2。话题开始时间

    我不明白,topic\u start\u time是一个datimetime字段,它甚至不在我的查询中

    下面是解释查询的完整结果:

    id select_type table type possible_keys 1 SIMPLE gallery_topics ref PRIMARY,user_start_time,previous_by_author (rows continued) key key_len ref rows Extra user_start_time 8 const 4 Using where id选择\u类型表类型可能的\u键 1个简单的图库主题参考主要、用户开始时间、作者之前的时间 (续) 键长度参考行额外 用户\u开始\u时间8常量4使用where 我应该在我的多字段索引中使用哪些字段,以便我的查询可以利用最佳索引?

    如果不知道所有可用索引是什么,很难说为什么选择了一个特定的索引。但是更容易理解为什么没有选择新索引:因为在
    topic\u id
    上有一个大于条件,并且索引首先存储按
    topic\u id
    排序的值,MySQL必须读入(至少从索引中读入)所有
    topic\u id>11
    的行,并检查WHERE子句上的附加条件。最好将
    topic\u id
    放在多列索引的最后,这样MySQL将根据两个相等条件对索引中的值进行分组;然后,检查大于条件很容易

    还有,表中有多少行?如果您没有具有代表性的测试数据,那么所有的赌注都将落在查询计划器将决定做什么上

    小结:要优化与您显示的查询完全相同的查询,请尝试索引

  • topic\u状态
  • topic\u海报
  • topic\u id
  • 如果不知道所有可用的索引是什么,就很难说为什么选择了一个特定的索引。但是更容易理解为什么没有选择新索引:因为在
    topic\u id
    上有一个大于条件,并且索引首先存储按
    topic\u id
    排序的值,MySQL必须读入(至少从索引中读入)所有
    topic\u id>11
    的行,并检查WHERE子句上的附加条件。最好将
    topic\u id
    放在多列索引的最后,这样MySQL将根据两个相等条件对索引中的值进行分组;然后,检查大于条件很容易

    还有,表中有多少行?如果您没有具有代表性的测试数据,那么所有的赌注都将落在查询计划器将决定做什么上

    小结:要优化与您显示的查询完全相同的查询,请尝试索引

  • topic\u状态
  • topic\u海报
  • topic\u id

  • 谢谢你,奎因!添加您建议的索引后,EXPLAIN说所使用的索引为空,额外的是“选择优化的表”。谷歌认为这意味着MySQL只是使用索引返回一个结果?这是有道理的,但是为什么MySQL不引用键下使用的索引呢?我不知道MySQL解释的复杂性(我是PostgreSQL的粉丝),但我打赌它没有被列出只是因为它不重要。如果表从未被命中(因为索引被覆盖),那么使用了(没有)什么键就无关紧要了。就是这样,你是个天才。谢谢你教我这一切。:-)谢谢你,奎因!添加您建议的索引后,EXPLAIN说所使用的索引为空,额外的是“选择优化的表”。谷歌认为这意味着MySQL只是使用索引返回一个结果?这是有道理的,但是为什么MySQL不引用键下使用的索引呢?我不知道MySQL解释的复杂性(我是PostgreSQL的粉丝),但我打赌它没有被列出只是因为它不重要。如果表从未被命中(因为索引被覆盖),那么使用了(没有)什么键就无关紧要了。就是这样,你是个天才。谢谢你教我这一切。:-)