账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    mysql索引排序问题
    374
    1

    问题描述

    如下表结构语句:

    CREATE TABLE `baby` (
      `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
      `uid` bigint(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
      `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (`id`),
      KEY `idx_uid` (`uid`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=18831518 DEFAULT CHARSET=utf8 COMMENT='订单交付记录';

    目前要根据uid执行翻页查询语句,并使用explain查看运行效果:

    explain select * from order_delivery where uid = 90734220505782 order by id asc;

    发现在Extra中存在filesort,这涉及到文件排序,会非常影响查询,尤其是命中数据比较多的情况:

    Using index condition; Using where; Using filesort

    问题出现的环境背景及自己尝试过哪些方法

    1. 创建了联合索引:对uid+id创建了联合索引,这样确实去掉了filesort情况

    你期待的结果是什么?实际看到的错误信息又是什么?

    1. 除了创建联合索引,还有别的方法,能提高该翻页的查询效率吗,即去调filesort。自己比较抵触这个索引的原因是,id本身就是主键索引,现在对uid+id又创建了索引,该觉很难受!
    4
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 1
    • Array 2020-01-19 17:161楼

      没毛病

    • 我在m城有车 普通会员 2楼

      在MySQL中,索引是数据库管理系统中用于提高查询速度的一种数据结构。在进行排序操作时,我们需要将数据表中的记录按照某个字段进行排序,通常使用ORDER BY语句实现。

      在ORDER BY语句中,我们通常会指定一个或多个字段,然后使用升序或降序排序这些字段。例如:

      sql SELECT * FROM table_name ORDER BY column_name ASC;

      这将按照column_name字段升序排序table_name中的所有记录。

      如果我们想要按照多个字段进行排序,我们可以使用逗号分隔的字段名。例如:

      sql SELECT * FROM table_name ORDER BY column_name1 ASC, column_name2 DESC;

      这将按照column_name1column_name2字段升序排序table_name中的所有记录。

      如果我们想要对查询结果进行分组,我们可以在ORDER BY语句中使用GROUP BY语句。例如:

      sql SELECT * FROM table_name GROUP BY column_name1, column_name2 ORDER BY column_name1 ASC, column_name2 DESC;

      这将按照column_name1column_name2字段对table_name进行分组,并按照每个组中的column_name1column_name2字段升序排序。

      注意,不同的字段类型可能会有不同的排序规则。例如,整数和浮点数通常按照它们的绝对值进行排序,字符串通常按照字母顺序进行排序,日期和时间通常按照它们的毫秒值进行排序。在使用ORDER BY语句时,我们需要仔细阅读和理解相关的文档,以确保我们的查询结果符合我们的预期。

    • 被雨傷透、 普通会员 3楼

      在MySQL中,索引是数据库管理系统中用于提高查询速度的一种数据结构。在进行排序操作时,我们需要将数据表中的记录按照某个字段进行排序,通常使用ORDER BY语句实现。

      在ORDER BY语句中,我们通常会指定一个或多个字段,然后使用升序或降序排序这些字段。例如:

      sql SELECT * FROM table_name ORDER BY column_name ASC;

      这将按照column_name字段升序排序table_name中的所有记录。

      如果我们想要按照多个字段进行排序,我们可以使用逗号分隔的字段名。例如:

      sql SELECT * FROM table_name ORDER BY column_name1 ASC, column_name2 DESC;

      这将按照column_name1column_name2字段升序排序table_name中的所有记录。

      如果我们想要对查询结果进行分组,我们可以在ORDER BY语句中使用GROUP BY语句。例如:

      sql SELECT * FROM table_name GROUP BY column_name1, column_name2 ORDER BY column_name1 ASC, column_name2 DESC;

      这将按照column_name1column_name2字段对table_name进行分组,并按照每个组中的column_name1column_name2字段升序排序。

      注意,不同的字段类型可能会有不同的排序规则。例如,整数和浮点数通常按照它们的绝对值进行排序,字符串通常按照字母顺序进行排序,日期和时间通常按照它们的毫秒值进行排序。在使用ORDER BY语句时,我们需要仔细阅读和理解相关的文档,以确保我们的查询结果符合我们的预期。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部