首页
学习
活动
专区
圈层
工具
发布

丁奇MySQL45讲特别篇:索引存储顺序和order by不一致,怎么办?

根据指定的字段排序来显示结果,是我们写应用时最常见的需求之一了,比如一个交易系统中,按照交易时间倒序显示交易记录。...我们来看看不同的业务需求下,SQL语句怎么写,以及在MySQL里是怎么执行的。 一、单字段排序 一个简单的需求是将这个表的数据,按照a的大小倒序返回。...因此上面这个语句的执行流程就是: 从索引ab上,取最右的一个记录,取出主键值ID_Z; 根据ID_Z到主键索引上取整行记录,作为结果集的第一行; 在索引ab上取上一个记录的左边相邻的记录; 每次取到主键...图2 order by 不需要排序 二、组合字段排序 有了上面的分析,我们再来看看下面这个语句: 这个语句的意思是,按照a值倒序,当a的值相同时按照b值倒序。...你一定发现了,这个语句的执行逻辑和执行结果,跟前面的语句是一模一样的,因此也不需要排序。 倒序不需要排序,正序呢?

11.8K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    大咖丁奇:索引存储顺序和order by不一致,怎么办?

    其创作的《MySQL实战45讲》专栏受众已逾2万人。 根据指定的字段排序来显示结果,是我们写应用时最常见的需求之一了,比如一个交易系统中,按照交易时间倒序显示交易记录。...我们来看看不同的业务需求下,SQL语句怎么写,以及在MySQL里是怎么执行的。 单字段排序 一个简单的需求是将这个表的数据,按照a的大小倒序返回。...因此上面这个语句的执行流程就是: 从索引ab上,取最右的一个记录,取出主键值ID_Z; 根据ID_Z到主键索引上取整行记录,作为结果集的第一行; 在索引ab上取上一个记录的左边相邻的记录; 每次取到主键...图2 order by 不需要排序 组合字段排序 有了上面的分析,我们再来看看下面这个语句: 这个语句的意思是,按照a值倒序,当a的值相同时按照b值倒序。...你一定发现了,这个语句的执行逻辑和执行结果,跟前面的语句是一模一样的,因此也不需要排序。 倒序不需要排序,正序呢?

    1.6K30

    MySQL给字符串加索引

    ,那这些语句就只能做全表扫描 MySQL 是支持前缀索引的,可以定义字符串的一部分作为索引。...t add index index2(email(6)); 第一个语句创建的 index1 索引里面,包含了每个记录的整个字符串; 而第二个语句创建的 index2 索引里面,对于每个记录都是只取前...有以下2中方式 就是使用倒序存储,比如身份证倒序,查询的时候再用函数转一下 以及使用hash字段,在表上创建一个整数字段,来保存身份证的校验码,同时在这个字段上加索引 这两种方式对比区别 从占用的额外空间来看...,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。...当然,倒序存储方式使用 4 个字节的前缀长度应该是不够的,如果再长一点,这个消耗跟额外这个 hash 字段也差不多抵消了。

    5.4K71

    面试官:如何给字符串设计索引?

    ,你可能会说直接执行下面的语句不就得了? alter table t add index index_url(url); 我随意画了张图,在 MySQL index_url 的结构是这样的: ?...有的,比如:倒序存储以及加哈希字段 4.1 倒序存储 先说第一种,在存储 url 时,倒序存。这时候前缀的区分度就很高啦,利用倒序建立前缀索引。...alter table t add url_crc int unsigned, add index(url_crc); 插入的时候可以这样做:调用 MySQL 的 crc32 函数计算出一个校验码,并保存入库...倒序存储的字段上创建的索引是按照倒序字符串的方式排序的,没有办法利用索引方式进行范围查询了。同样地,hash 字段的方式也只能支持等值查询。...它们的区别,主要体现在以下三个方面: 从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。

    96320

    MySQL 字符串索引优化方案

    也就是说,前缀索引除了会增加查询语句的次数,还会禁止使用覆盖索引。 2. 倒序存储# 对于邮箱这类的字符串来说,由于前几位有较大的区分度,所以用前缀索引还不错。...一个比较好的办法是将字符串倒序存储,将区分度高的字符开头。...而 Hash 字段和倒序查询两种方式就不行了,倒序查询是按照倒序字符串存储的,而 hash 字段和字符串本身也没有关系,这就意味着这两种方式是不支持范围查询的。...在占用空间上来说,倒序存储占用的是和普通索引的一样的空间。而 hash 字段,需要增加一个字段来存在 hash 校验码。 在 CPU 消耗,倒序时,每次读和写都需要调用 reverse 函数。...倒序存储,再创建前缀索引,节省空间,增加扫描次数,不能利用覆盖索引。 hash 字段,性能稳定,但占用额外的空间,不支持范围查询。

    1K10

    怎么给字符串加索引

    MySQL 支持前缀索引,可以定义字符串的一部分作为索引,创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。...; 第一个语句创建的 index1 索引里面,包含了每个记录的整个字符串。...第二个语句创建的index2 索引里面,对于每个记录都是指取前6个字节。 ? 使用前缀索引,定义好长度,就可以做到节省索引空间,同时不额外增加太多的查询成本。...第一种方式是使用倒序存储 身份证最后 6 位,没有重复逻辑,因此最后 6 位可能提供了足够的区分度。 先倒序存储,然后再创建前缀索引。...CPU 消耗方面,倒序每次写和读的时候,需要额外一个 reverse 函数,而 hash 字段的方式需要额外调用一次 crc32() 函数。reverse 函数额外消耗的 CPU 资源会更小些。

    3.3K10

    一个有意思的方案:不借助后台和 JS ,只用 CSS 让一个列表编号倒序,你会怎么做?

    我正在做一个项目,其中有一个倒序的列表。列表创建时间降序排序的,这里我想在语义和视觉上都能体现出来(让列表显示对应的编号,编号越大表示是最新的)。... C B A reversed 属性是一个布尔属性,reversed 属性规定列表顺序为降序 (...CSS 自定义的 counter() 第三种方式就是使用CSS的 counter 计算器, 要倒序计数器的顺序,我们有两件事要做:将计数器重置为非0的值,并以负数递增计数器。...另外我还在 StackOverflow 上找到的另一个非常有创意的解决方案。其结果与Flexbox的解决方案类似,但也有更多的缺点(例如,它会干扰滚动)。...---- 代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

    1.7K11

    MySQL实战问题01 索引相关

    如果能够将更新操作先记录在 change buffer,减少读磁盘,语句的执行速度会得到明显的提升。...哈希字段 以在表上再创建一个整数字段,来保存身份证的校验码,同时在这个字段上创建索引 mysql> alter table t add id_card_crc int unsigned, add index...使用倒序存储和使用 hash 字段这两种方法的异同点。 从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。...当然,倒序存储方式使用 4 个字节的前缀长度应该是不够的,如果再长一点,这个消耗跟额外这个 hash 字段也差不多抵消了 在 CPU 消耗方面,倒序方式每次写和读的时候,都需要额外调用一次 reverse...而倒序存储方式毕竟还是用的前缀索引的方式,也就是说还是会增加扫描行数。

    95410

    一张千万级别数据的表想做分页,如何优化?

    介绍 当进行分页时,MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后放弃前 offset 行,返回 N 行。例如 limit 10000, 20。...mysql排序取出10020条数据后,仅返回20条数据,查询和排序的代价都很高。...那当 offset 特别大的时候,效率就非常的低下,所以我们要对sql进行改写 使用书签 用书签记录上次取数据的位置,过滤掉部分数据 如下面语句 SELECT id, name, description...description FROM film JOIN (SELECT id from film ORDER BY name LIMIT 100,5) temp ON film.id = temp.id 倒序查询...假如查询倒数最后一页,offset可能回非常大 SELECT id, name, description FROM film ORDER BY name LIMIT 100000, 10; 改成倒序分页

    1.8K20

    MySQL深入学习第十一篇-怎么给字符串字段加索引?

    同时,MySQL 是支持前缀索引的,也就是说,你可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。...(email(6)); 第一个语句创建的 index1 索引里面,包含了每个记录的整个字符串;而第二个语句创建的 index2 索引里面,对于每个记录都是只取前 6 个字节。...第一种方式是使用倒序存储。...倒序存储的字段上创建的索引是按照倒序字符串的方式排序的,已经没有办法利用索引方式查出身份证号码在[ID_X, ID_Y]的所有市民了。同样地,hash 字段的方式也只能支持等值查询。...从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。

    2.5K10

    MySQL实战第十一讲-怎么给字符串字段加索引?

    同时,MySQL 是支持前缀索引的,也就是说,你可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。...(email(6)); 第一个语句创建的 index1 索引里面,包含了每个记录的整个字符串;而第二个语句创建的 index2 索引里面,对于每个记录都是只取前 6 个字节。...第一种方式是使用倒序存储。...倒序存储的字段上创建的索引是按照倒序字符串的方式排序的,已经没有办法利用索引方式查出身份证号码在[ID_X, ID_Y]的所有市民了。同样地,hash 字段的方式也只能支持等值查询。...从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。

    3K30

    数据库索引问题

    # 背景 群上有一位同学咨询一个问题,两个查询语句,就一个limit 11, 一个limit 12,处理的效率相差巨大,如下图: ? ?...# 解决 原因就是因为limit不同,导致走了不同的索引 走的索引不一样,决定了要检索的数据量多少 1、当你要取的数据很少的时候,mysql认为走start_time的索引很快就能找够满足条件的数据,结果实际上满足条件的数据按照...start_time倒序排列需要检索很多数据,所以会比较慢。...2、而当你limit20的时候mysql认为按照其他索引可能需要扫描很多的记录才能找到你要的结果,所以走了city_id的索引。...so这种情况你可以尝试一下按照start_time倒序排列后找两条最近的数据出来,按这些字段的值再去用limit 0,2检索看看是不是很快,如果是的话那就可以确定是这个原因。

    1K20

    NodeJS 5分钟 连接MySQL 增删改查 🥇

    MySQL 下载地址 MySQL Workbench 下载地址 初始化项目 在实操之前,首先要有一个库,库是用来存放数据的。...这条语句其实很简单,翻译一下每个单词就能懂这条语句的内容。 最后使用 query() 方法执行操作。第一个参数是 SQL 语句;第二个参数是回调函数。...查 select 我使用上面的 SQL 语句添加了3条数据 因为新增操作比较简单,我就不重复演示了。 查询的操作其实是最繁多的,接下来会一个一个介绍。...const sql = `select * from users order by id asc;` 倒序 倒序使用 desc 关键字。...const sql = `select * from users order by id desc;` 复制代码 此时就通过 id 字段的倒序进行排列 改 update 如果要修改数据,可以使用 update

    1.8K10

    情人节福利,手把手教你学会mysql语句操作

    这是我的第八篇原创文章 上篇文章简单说了下数据库,并教了怎样安装mysql工具和可视化工具,不知道你现在安装好了没?那今天我们继续说mysql,今天说下mysql语句。...注意:那个数据库的引号是个反引号,在tab键的上方,还有mysql的注释是两个划线再加一个空格。语句结束后最好加个 ; 来结束 在这里我们也可以看看我们已有的数据库 ?...这里可以看到他是按照id来倒序来排的,ORDER BY 后面跟的是排序条件,而那个DESC是倒序,默认是顺序,为ASC。 查询还不止这些,比如还可以指定偏移数来查询多少数据,如下 ?...这是删除students表的性别为男的数据 END 好了,如果你跟着我一步步做,恭喜你,学会了简单的数据库语句,现在留个练习给你们,可以检验下自己有没有学会操作mysql: 1.创建一个数据库,然后设计一个新闻表...(数据类型要使用合理) 2.使用SQL语句向数据表写入十五条不同的数据 3.使用SQL语句查询类别为“百家”的新闻数据 4.使用SQL语句删除一条新闻数据 5.使用SQL语句查询所有的新闻,以添加时间的倒序进行排列

    1.2K140

    技术分享 | 如何通过 binlog 定位大事务?

    1序 大事务想必大家都遇到过,既然要对大事务进行拆分,第一步就是要找到它。那么如何通过 binlog 来定位到大事务呢?...版本 v4 GTID 已开启 已验证的 MySQL 版本 MySQL 5.7.30、MySQL 8.0.28 首先,我们解析出一个 binlog 中按照事务大小排名前 N 的事务。...while read line do # 事务大小这里取近似值,因为不是通过(TRANS_END_POS-TRANS_START_POS)计算出的 TRANS_SIZE=$(echo $...my2sql 可指定 rows 和 time 进行过滤,在 mode 为 file 且 work-type 为 stats 时,连接任意一个 MySQL 实例(无需原库)均可对 binlog 中的事务进行解析.../tmpdir # 按照事务的行数倒序排序 [root@localhost ~]$ less tmpdir/biglong_trx.txt | sort -nr -k 6 | less # 按照事务的执行时间倒序排序

    1.4K11

    聊聊Order By

    但是,凡事都有例外,如果一条 SQL 语句读取过多的记录,哪怕是使用 ,当排序缓冲区满时,也需要把缓冲区中的记录排好序组成一个数据块,写入磁盘文件,这样一来,即要使用磁盘文件...想要了解 MySQL 中 limit 是怎么实现的,可以参考这篇文章:MySQL 查询语句的 limit, offset 是怎么实现的?...倒序排序 MySQL 文件排序的内部实现中,正序和倒序排序都是以正序的方式进行的,排序字段值大的在前面,排序字段值小的在后面,这样逻辑统一,实现方便。...3 号图示表示倒序排序之后,排序缓冲区中的记录示意图。 从 3 号图示可见,倒序排序时,对排序字段值取反之后按照正序排序,最终实现了记录的倒序排序。...倒序排序小节,介绍了倒序排序的实现:先对排序字段(sort_key)逐字节取反,然后对排序字段进行正序排序,最终得到倒序排序的记录。

    1.2K20

    Mysql之limit用法的步骤

    LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。 LIMIT 接受一个或两个数字参数,参数必须是一个整数常量。...如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。...初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。...,它表示返回最大的记录行数目 3、查询后n行记录 select * from table order by id desc limit n;//倒序排序,取前n行 id为自增形式 4、查询第n...注:这种写法本身就是错的,虽然它可以在之前的版本中运行(低优先级),新版本的mysql对此做出了修复,现在的替代方法是第二个参数用一个较大的正数代替。

    5.6K40

    带你一步一步深入了解 MySQL Order By 文件排序

    但是,凡事都有例外,如果一条 SQL 语句读取过多的记录,哪怕是使用 ,当排序缓冲区满时,也需要把缓冲区中的记录排好序组成一个数据块,写入磁盘文件,这样一来,即要使用磁盘文件...想要了解 MySQL 中 limit 是怎么实现的,可以参考这篇文章:MySQL 查询语句的 limit, offset 是怎么实现的?...倒序排序 MySQL 文件排序的内部实现中,正序和倒序排序都是以正序的方式进行的,排序字段值大的在前面,排序字段值小的在后面,这样逻辑统一,实现方便。...3 号图示表示倒序排序之后,排序缓冲区中的记录示意图。 从 3 号图示可见,倒序排序时,对排序字段值取反之后按照正序排序,最终实现了记录的倒序排序。...倒序排序小节,介绍了倒序排序的实现:先对排序字段(sort_key)逐字节取反,然后对排序字段进行正序排序,最终得到倒序排序的记录。

    1.9K42
    领券