当前位置: 首页 > 面试题库 >

了解MySQL查询中的多个列索引

韩照
2023-03-14
问题内容

这是查询:

SELECT * FROM table WHERE accountid = 1 ORDER BY logindate DESC LIMIT 1

现在,如果我在字段上添加了带有多列的索引:

INDEX(accountid,logindate)

MySQL将利用此多列索引吗?还是不使用它,因为一个字段位于where子句中,而另一个字段位于order语句中?还是只要我按多列索引的顺序使用字段就没关系吗?


问题答案:

好问题。

索引从左到右起作用,因此您的WHERE条件将使用索引。在这种情况下,排序也将利用索引(下面的执行计划)。

从手册:

即使ORDER BY索引与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外的ORDER BY列在WHERE子句中都是常量即可。以下查询使用索引来解析ORDER BY零件:

SELECT * FROM t1
WHERE key_part1=constant
ORDER BY key_part2;

如果您只有一个列索引(accountid),则将使用文件排序。因此,您的查询确实受益于该索引。

两栏索引

create table t1 (
  accountid tinyint,
  logindate date);

create index idx on t1 (accountid, logindate);

insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'), 
    (1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), 
    (1, '2012-09-01'), (3, '2012-10-19'), (1, '2012-03-01')

执行计划

ID SELECT_TYPE表类型POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE t1 ref idx idx 2 const 5100使用位置; 使用索引

单列索引

create table t1 (
  accountid tinyint,
  logindate date);

create index idx on t1 (accountid);

insert into t1 values (1, '2012-09-05'), (2, '2012-09-09'), (3, '2012-09-04'), 
    (1, '2012-09-01'), (1, '2012-09-26'), (2, '2012-05-16'), (1, '2012-09-01'), 
    (3, '2012-10-19'), (1, '2012-03-01')

执行计划

ID SELECT_TYPE表类型POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE t1范围idx idx 2 5 100 使用文件排序


 类似资料:
  • 问题内容: 所有查询都是独立工作的,但实际上很难将所有内容组合到一个结果中,因此我可以将其与mysql_fetch_array一起使用。 我试图创建视图以及临时表,但是每次它说表不存在或返回一个空的获取数组循环时……都有逻辑但语法混乱,我认为这是我第一次处理多个查询,我需要将所有查询合并在一起。期待获得支持。非常感谢。 问题答案: 多亏了php.net,我提出了一个解决方案:您必须使用它来运行多个

  • 问题内容: 我有一张像这样的桌子: 我的问题是;我想找到谁有一个叫亚历克斯的孩子。 我无法在SQL中使用,因为在同一单元格中有多个名称。 所以我用-看起来很聪明,但同时我像Alex一样开始一切:( Alexandre或我想获得dia,但结果是dia和diana :( 如何获得该数据类型的单个Alex? 我希望我能用我的英语不好来解释我的问题:D 问题答案: 最好的解决方案是规范您的架构。您应该有一

  • 问题内容: 我正在尝试在单个查询中计算两列,但结果却为medcount和uploadcount吐出了相同的值。有什么建议? 问题答案: 使用:

  • 问题内容: 想象一个有多列的表,例如。我通常按​​进行选择,但是,客户端应用程序中有多个查询,它们对列的子集使用各种条件。 当MySQL在多列有多个WHERE条件的单个表上执行查询时,它真的可以利用在不同列上创建的索引吗?还是使其快速的唯一方法是为所有可能的查询创建多列索引? 问题答案: 是的,MySQL可以对单个查询使用多个索引。优化器将确定哪些索引将使查询受益。您可以用来获取有关MySQL如何

  • 问题内容: 基本上有属性表和翻译表-一个属性有很多翻译。 我需要从翻译中为指定属性的每个属性选择id和value,即使该语言没有翻译记录也是如此。我缺少某种连接技术,或者连接(不涉及语言表)在这里不起作用,因为以下操作不会返回具有指定语言的不存在的翻译的属性。 所以我正在使用这样的子查询,这里的问题是用相同的参数在同一个表中创建两个子查询(感觉像性能消耗,除非mysql将那些子查询分组,我怀疑这是

  • 现在,我要检索一个值: Q1:在[3.3,6.6]范围内-预期返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6](包括最后一个),如果没有,则为[3.3,5.5]或[3.3,3.3,5.5]。 Q2:在[2.0,4.0]范围内-预期返回值:[3.3]或[3.3,3.3] 对于任何其他多索引维度都是相同的,例如B值: Q3:在范围[111,500]中有重复,作为范围中的数据行数-