RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1204563
Accepted
Алексей Ковальчук
Алексей Ковальчук
Asked:2021-11-14 21:43:49 +0000 UTC2021-11-14 21:43:49 +0000 UTC 2021-11-14 21:43:49 +0000 UTC

为什么索引不用于排序?

  • 772

我有一张桌子:

CREATE TABLE `player_statistics` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `player_id` INT(11) NOT NULL,
    `statistic_id` INT(11) NOT NULL,
    `value` INT(11) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `statistic_player_value` (`statistic_id`, `player_id`, `value`)
)

如您所见,有一个statistic_player_value包含 3 列的索引:statistic_id、player_id、value。

我用这个查询测试索引:

explain SELECT *
FROM `player_statistics` 
WHERE `statistic_id`=1 AND `player_id` =15
ORDER BY `value` desc
LIMIT 10;

结果:

+------+-------------+-------------------+------+-----------------------------------------------+------------------------+---------+-------------+------+--------------------------+
| id   | select_type | table             | type | possible_keys                                 | key                    | key_len | ref         | rows | Extra                    |
+------+-------------+-------------------+------+-----------------------------------------------+------------------------+---------+-------------+------+--------------------------+
|    1 | SIMPLE      | player_statistics | ref  | player_id,statistic_id,statistic_player_value | statistic_player_value | 8       | const,const |    1 | Using where; Using index |
+------+-------------+-------------------+------+-----------------------------------------------+------------------------+---------+-------------+------+--------------------------+

如您所见,它key_len等于 8,这意味着索引没有完全使用。player_id也只statistic_id使用了一个索引。我希望它key_len应该是12。

例如,此查询返回key_len12:

explain SELECT *
FROM `player_statistics` 
WHERE `statistic_id`=1 AND player_id =15 AND `value` = 1

那么问题是什么,为什么 order by 不使用索引呢?

mysql
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Shturmavik
    2021-11-15T00:24:36Z2021-11-15T00:24:36Z

    您的复合索引有效,因为您在WHERE带有字段的查询中使用它

    key_len清楚地表明它是全部使用还是仅部分使用

    由于您有INTEGER 字段在数据库中分配了 4 个字节的内存,并且您在 WHERE 中使用了两个字段,因此在过滤两个字段时您的查询将得到 8。

    或 4 个字节 - 每个字段一个。

    !!因为过滤已经完成,我们看到没有使用 12 个字节,而是在您的情况下使用了 8 个字节。

    复合索引可以包含多于一列和最多 16 列,但它们的总长度限制为 900 字节。

    • 关于 habré 的索引
    • 关于为字段类型分配的字节
    • 关于解释

    MySQL 查询优化器尝试为此查询提出最佳执行计划。

    在此处输入图像描述

    我提供详细信息: 史前史以下截图:

    USING WHERE - 并不意味着不使用索引。这意味着还要检查结果是否符合条件。在 key 列中可以看到拉取数据时索引的存在。

    在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

    单个字段的情况: 在此处输入图像描述 在此处输入图像描述

    问题:为什么感觉 INDEX 不适用于 ORDER BY? 回复dev.mysql.com

    在页面中搜索字符串ORDER BY Execution Plan Information Available 在此处输入图像描述

    我提前简短地回答:我们没有遇到 Extra 列中的文本 Using filesort - 一切正常!如果不使用索引,请参阅使用文件排序

    • 如果 possible_keys 和/或至少填写了 key,并且 Extra 中没有 Using filesort 并且没有 Using temporary,那么索引就起作用了。

    检查索引的运行情况:删除索引并用 EXPLAIN 进行同样的查询,如果行数变大一个数量级,则索引以前工作过。

    由于 sql 版本,或数据库类型,或使用的查询 + 优化器决定显示什么和不显示什么,部分信息可能无法使用 EXPLAIN 显示

    • 4

相关问题

  • MySQL - 将一列中单元格的每个值与另一列中的值匹配,并将其替换为相邻列中的值

  • 帮助编写 MySQL 查询

  • SELECT 只增加 MYSQL 值

  • 创建 MySQL 表时的字段

  • 如何连接到远程mysql数据库?

  • MySQL单元格中的随机值

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5