在MySQL上的多字段索引中拾取字段
我有一个我想优化的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 主题海报 专题组状态 我对这个查询进行了解释,希望解释查询会告诉我查询使用了我以前的作者索引。
SELECT min(`topic_id`) FROM `gallery_topics` where `topic_id` > 11 AND `topic_poster` = 5 AND `topic_status` = 0
我想添加一个包含多个字段的索引以优化此查询,因此我添加了一个由作者命名为previous_的键,并按以下顺序添加了这三个键:
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的粉丝),但我打赌它没有被列出只是因为它不重要。如果表从未被命中(因为索引被覆盖),那么使用了(没有)什么键就无关紧要了。就是这样,你是个天才。谢谢你教我这一切。:-)