首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL ORDER BY主键id加LIMIT限制走错索引

背景及现象 report_product_sales_data表数据量2800万; 经测试,在当前数据量情况下,order by主键id,limit最大到49的时候可以用到索引report_product_sales_data_hq_code_orgz_id_index...,大于49时就走PRIMARY主键索引。...在order by 主键id时,limit值的大小达到了某个临界值后,改变了执行计划,选择了主键索引,但不知道具体的规则究竟是怎样。...由于自身的优化器选择,为了避免某些排序的消耗,可能会走非预期的PRIMARY主键索引; 对于数据量比较大,而且执行量很高的分页sql,尽可能将所有的查询字段包括在索引中,同时使用索引来消除排序; 多用explain...查看是否使用到了最优索引; 利用optimizer trace查看优化器执行过程; 观察mysql的slow_query_log,及时做排查优化。

6.6K32

MySQL ORDER BY主键id加LIMIT限制走错索引

背景及现象 report_product_sales_data表数据量2800万; 经测试,在当前数据量情况下,order by主键id,limit最大到49的时候可以用到索引report_product_sales_data_hq_code_orgz_id_index...在order by 主键id时,limit值的大小达到了某个临界值后,改变了执行计划,选择了主键索引,但不知道具体的规则究竟是怎样。...由于自身的优化器选择,为了避免某些排序的消耗,可能会走非预期的PRIMARY主键索引; order by 和 limit 结合使用,如果where 字段,order by字段都是索引,那么有limit索引会使用...order by字段所在的索引,没有limit会使用where 条件的索引; 对于数据量比较大,而且执行量很高的分页sql,尽可能将所有的查询字段包括在索引中,同时使用索引来消除排序; 多用explain...查看是否使用到了最优索引; 利用optimizer trace查看优化器执行过程; 观察mysql的slow_query_log,及时做排查优化。

1.8K10
您找到你想要的搜索结果了吗?
是的
没有找到

Mysqllimit用法

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql...【引用,路人乙:Mysqllimit的用法详解】 2、Mysql的分页查询语句的性能分析       MySql分页sql语句,如果和MSSQL的TOP语法相比,那么MySQLLIMIT语法要显得优雅了许多...因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。...实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。...建议优化的时候,加上主键和索引,查询效率会提高。

2.7K30

mysqllimit实现分页

MySQL中使用 LIMIT 实现分页 格式: LIMIT 位置偏移量, 行数 第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始...SELECT employee_id,last_name FROM employees LIMIT 31,2; [在这里插入图片描述] MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,...MySQL8.0新特性:LIMIT ... OFFSET ... 练习:表里有107条数据,如果只想要显示第 32、33 条数据怎么办呢?...拓展 LIMIT 可以使用在MySQL、PGSQL、MariaDB、SQLite 等数据库中使用,表示分页。不能使用在SQL Server、DB2、Oracle中。...在 MySQL、PostgreSQL、MariaDB 和 SQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面。

3.3K60

MySQLlimit查询优化

我们大家都知道MySQL数据库的优化是相当重要的。其他最为常用也是最为需要优化的就是limitMySQLlimit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。...同样是取10条数据 select * from users limit 10000,10 select * from users limit 0,10   就不是一个数量级别的。   ...网上也很多关于limit的五条优化准则,都是翻译自MySQL手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。   ...文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。...以后要注意改正自己的limit语句,优化一下MySQL

2.2K90

Mysqllimit的用法

目录 目录 前言 limit语法 性能分析 优化 用id优化 用覆盖索引优化 总结 前言 日常开发中,我们使用mysql来实现分页功能的时候,总是会用到mysqllimit语法.而怎么使用却很有讲究的...因为limit 10000,10的语法实际上是mysql查找到前10010条数据,之后丢弃前面的10000行,这个步骤其实是浪费掉的....优化 用id优化 先找到上次分页的最大ID,然后利用id上的索引来查询,类似于select * from user where id>1000000 limit 100....用覆盖索引优化 mysql的查询完全命中索引的时候,称为覆盖索引,是非常快的,因为查询只需要在索引上进行查找,之后可以直接返回,而不用再回数据表拿数据.因此我们可以先查出索引的ID,然后根据Id拿数据....联系邮箱:huyanshi2580@gmail.com 更多学习笔记见个人博客——>呼延十 var gitment = new Gitment({ id: 'Mysqllimit的用法', //

10.8K20

Mysqllimit用法的步骤

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

3.7K40

mysql 前缀索引_MySQL前缀索引

有时候需要索引很长的字符字段列,这会增加索引的存储空间以及降低索引的查询效率,一种策略是可以使用哈希索引,还有一种就是使用前缀索引。...前缀索引是选择字符列的前n个字符作为索引,这样可以大大节约索引空间,从而提高索引效率。...前缀索引的选择性 使用前缀索引,在一些场景下可能使得重复的索引值变多,索引的选择性变低,查找时需要过滤更多的行,因此建立前缀索引也要考虑前缀的索引选择性不能太低。...MySQL 无法使用前缀索引做 ORDER BY 和 GROUP BY , 也无法使用前缀索引做覆盖扫描。...后缀索引 MySQL 没有提供后缀索引,事实上,一些业务场景对后缀匹配选择性更高,比如我曾经参与过的项目,手机的入网标示imei号,前缀都是86等固定的国家编号开头,这个时候可以将字符反转后存储,就可以建立选择性较高的前缀索引

4.8K30

MySQL 案例:Limit 分页查询优化

MySQL 支持的 SQL 语法中对此有特殊的支持,开发人员在实现这类功能的时候很方便: select * from xxx limit M,N select * from xxx limit N...[性能效果图] 两个语句的内容都非常简单,差别只在 limit 的部分,第一个语句跳过的行数很少,第二个语句跳过的行数很多,结果是两个语句的执行时间差了至少 200 倍。...PS:limit 配合 order by 使用是一个好习惯,确保结果数据是稳定的。...可以看到跳过的行数大幅度增长时,SQL 语句的执行时间也会快速增长,原因其实比较简单:在处理 limit M,N 的时候,MySQL 会先拿到 M+N 行结果数据,然后再丢弃 M 行数据,展示之后剩下的...总结一下 MySQL 由于本身查询优化器覆盖到的场景不够全,慢查询的原因也千奇百怪,各类业务 SQL 在上线前尽量多覆盖一些场景,确保业务功能安全发布。

3.4K4432

带你读 MySQL 源码:limit, offset

我一直想写 MySQL 源码分析文章,希望能够达成 2 个目标: 不想研究源码的朋友,可以通过文章了解 MySQL 常用功能的实现逻辑,做到知其然,也知其所以然。...想研究源码的朋友,能够以文章为切入点,迈进 MySQL 源码研究之门。 目标是明确的,任务是艰巨的。 MySQL 源码数量庞大,各种功能的代码盘根错节,相互交织在一起,形成一张复杂的网。...对 MySQL 源码感兴趣的朋友们,如果想看到源码分析系列的更多文章,请帮忙把文章传播出去,分享给更多人。...本文内容基于 MySQL 8.0.32 源码。 正文 1....offset 逻辑了(因为已处理完成) // 下次读取时也就不需要再跳过 m_offset 条记录了 m_needs_offset = false; ...

87830

mysql前缀索引使用,Mysql:前缀索引索引

可以像普通索引一样使用mysql前缀索引吗?...解决方法: 如果你想一下,MySQL仍会给你正确的答案,即使没有索引…它只是不会那么快……所以,是的,你仍然会得到一个正确的答案前缀索引....前缀索引的排序不超出前缀的长度.如果您的查询使用完整索引来查找行,您通常会发现返回的行是按索引顺序隐式排序的.如果您的应用程序需要这种行为,那么它当然会期待它不应该期望的东西,因为除非您显式ORDER...并且,前缀索引不能用作覆盖索引.覆盖索引是指SELECT中的所有列恰好包含在一个索引中的情况(加上可选的主键,因为它也总是存在).优化器将直接从索引读取数据,而不是使用索引来标识要在主表数据中查找的行....标签:mysql,indexing,innodb 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142503.html原文链接:https://javaforall.cn

5.3K20

Mysql覆盖索引_mysql索引长度限制

只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。...(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询) 覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql...当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息 覆盖索引的坑:mysql查询优化器会在执行查询前判断是否有一个索引能进行覆盖,假设索引覆盖了where条件中的字段...如上图则无法使用覆盖查询,原因: 1.没有任何索引能够覆盖这个索引。因为查询从表中选择了所有的列,而没有任何索引覆盖了所有的列。 2.mysql不能在索引中执行LIke操作。...mysql能在索引中做最左前缀匹配的like比较,但是如果是通配符开头的like查询,存储引擎就无法做比较匹配。

7.8K30
领券