MySQL LIMIT 查询优化

最近常在 SQL 中使用到 LIMIT ? ?,在执行 LIMIT 0, 1000 与 LIMIT 100000, 1000 时,查询速度明显有很大的区别,而且随着 LIMIT 的偏移量的增加,查询速度越来越慢。是否有办法对 SQL 中 LIMIT 查询进行优化呢? LIMIT 速度慢的原因 LIMIT 100000, 1000 的意思扫描满足条件的 101000 行,扔掉前面的 100000 行,返回最后的 1000 行,问题就在这里。 LIMIT 优化思路 1、尽可能从索引中直接获取数据,避免或减少直接扫描行数据的频率 2、尽可能减少扫描的记录数,也就是先确定起始的范围,再往后取 N 条记录即可 LIMIT 优化示例 原始 SQL -- 含条件 SELECT * FROM `t1` WHERE ftype=1 ORDER BY id DESC LIMIT 100, 10; -- 不含 WHERE SELECT * FROM `t1` ORDER BY id DESC LIMIT 100, 10; 子查询优化 SQL -- 采用子查询的方式优化,在子查询里先从索引获取到最大 id,然后倒序排,再取 10 行结果集 -- 注意这里采用了 2 次倒序排,因此在取 LIMIT 的 start 值时,比原来的值加了 10,即 935510,否则结果将和原来的不一致 SELECT * FROM (SELECT * FROM `t1` WHERE id > ( SELECT id FROM `t1` WHERE ftype=1 ORDER BY id DESC LIMIT 935510, 1) LIMIT 10) T ORDER BY id DESC; INNER 优化 SQL -- 采用 INNER JOIN 优化,JOIN 子句里也优先从索引获取 ID 列表,然后直接关联查询获得最终结果,这里不需要加 10 SELECT * FROM `t1` INNER JOIN ( SELECT id FROM `t1` WHERE ftype=1 ORDER BY id DESC LIMIT 935500,10) t2 USING (id); 1、要学着使用 EXPLAIN 对 SQL 进行优化调整 2、推荐使用 INNER 优化 SQL 3、发现了一个 ubuntu 中监控 MySQL 的 mytop 命令,刚刚安装还没细研究 ...

September 18, 2016 · 1 min · 200 words · Me

LeetCode Database Trips and Users 262

262. Trips and Users The Trips table holds all taxi trips. Each trip has a unique Id, while Client_Id and Driver_Id are both foreign keys to the Users_Id at the Users table. Status is an ENUM type of (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’). +----+-----------+-----------+---------+--------------------+----------+ | Id | Client_Id | Driver_Id | City_Id | Status |Request_at| +----+-----------+-----------+---------+--------------------+----------+ | 1 | 1 | 10 | 1 | completed |2013-10-01| | 2 | 2 | 11 | 1 | cancelled_by_driver|2013-10-01| | 3 | 3 | 12 | 6 | completed |2013-10-01| | 4 | 4 | 13 | 6 | cancelled_by_client|2013-10-01| | 5 | 1 | 10 | 1 | completed |2013-10-02| | 6 | 2 | 11 | 6 | completed |2013-10-02| | 7 | 3 | 12 | 6 | completed |2013-10-02| | 8 | 2 | 12 | 12 | completed |2013-10-03| | 9 | 3 | 10 | 12 | completed |2013-10-03| | 10 | 4 | 13 | 12 | cancelled_by_driver|2013-10-03| +----+-----------+-----------+---------+--------------------+----------+ The Users table holds all users. Each user has an unique Users_Id, and Role is an ENUM type of (‘client’, ‘driver’, ‘partner’). ...

September 14, 2016 · 3 min · 436 words · Me

LeetCode Database Department Highest Salary 184

184. Department Highest Salary The Employee table holds all employees. Every employee has an Id, a salary, and there is also a column for the department Id. +----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | +----+-------+--------+--------------+ The Department table holds all departments of the company. ...

September 12, 2016 · 2 min · 281 words · Me

LeetCode Database Consecutive Numbers 180

180. Consecutive Numbers Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | +----+-----+ For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times. ...

September 11, 2016 · 1 min · 173 words · Me

LeetCode Database Second Highest Salary 176

176. Second Highest Salary Write a SQL query to get the second highest salary from the Employee table. +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ For example, given the above Employee table, the second highest salary is 200. If there is no second highest salary, then the query should return null. 大体意思 写 SQL 查询出第二高薪水的 Id。如何没有第二高,则返回 null ...

September 11, 2016 · 2 min · 257 words · Me

LeetCode Database Rising Temperature 197

197. Rising Temperature Given a Weather table, write a SQL query to find all dates’ Ids with higher temperature compared to its previous (yesterday’s) dates. +---------+------------+------------------+ | Id(INT) | Date(DATE) | Temperature(INT) | +---------+------------+------------------+ | 1 | 2015-01-01 | 10 | | 2 | 2015-01-02 | 25 | | 3 | 2015-01-03 | 20 | | 4 | 2015-01-04 | 30 | +---------+------------+------------------+ For example, return the following Ids for the above Weather table: ...

September 11, 2016 · 1 min · 127 words · Me

MyBatis Generator 使用配置

⚠️ 内容声明 本文写于 2016 年,内容已不再维护更新。文章中的部分内容已过时: MyBatis Generator 版本:文中使用的是 1.3.5 版本,当前最新版本已更新至 1.4.x,提供了更多功能和改进 MySQL 驱动:文中使用的 com.mysql.jdbc.Driver 已被弃用,应使用 com.mysql.cj.jdbc.Driver Eclipse IDE:现代 Java 开发更多使用 IntelliJ IDEA,且 IDE 对 MyBatis 的支持已有专门的插件(如 MyBatisX) 当前最佳实践: 使用 MyBatis Generator 最新版本(1.4.x) 配合现代构建工具(Maven/Gradle)和 IDE 插件使用 考虑使用 MyBatis-Plus 等增强框架,提供更便捷的代码生成和 CRUD 操作 对于新项目,建议评估是否需要代码生成器,或考虑使用 JPA/Spring Data JPA 等现代 ORM 方案 MyBatis Generator (MBG) 是一个 MyBatis 的代码生成器。MBG 可以内省数据库的表(或多个表),然后生成可以用来访问(多个)表的基础对象。这样在与数据库表进行交互时,不需要手动创建对象和配置文件。MBG 解决了对数据库操作影响最大的一些简单 CRUD(插入、查询、更新、删除)操作。 MyBatis Generator 文档 MyBatis Generator 官方文档 MyBatis Generator 中文文档 通过 Maven 运行 MBG MyBatis Generator (MBG) 包含了一个可以集成到 Maven 构建的 Maven 插件,按照 Maven 的配置惯例,将 MBG 集成到 Maven 很容易。 ...

September 10, 2016 · 5 min · 924 words · Me, LLM

SpringMVC 入门使用

⚠️ 内容声明 本文写于 2016 年,部分内容已过时,仅供历史参考: XML 配置方式的 SpringMVC 已不再推荐 web.xml 配置前端控制器的方式已过时 JSP 视图技术已较少使用 文中提及的 Struts2 框架已基本淘汰 当前最佳实践(2024+): 项目创建:使用 Spring Initializr 生成 Spring Boot 项目,自动配置 DispatcherServlet 控制器:使用 @RestController 直接返回 JSON,无需 @ResponseBody 路由注解:使用 @GetMapping、@PostMapping 等简化注解替代 @RequestMapping 参数绑定:MVC 基础概念仍适用,但推荐结合 Bean Validation(@Valid)进行校验 视图层:前后端分离(REST API + Vue/React),或使用 Thymeleaf 模板 配置方式:Java Config + application.yml,无需 XML 配置 本文主要参考了 imooc-SpringMVC 起步 视频教程和 SpringMVC 从入门到精通 系列 - HansonQ ,还有自己的一些总结。 主要内容:MVC 简介、前端控制器模式、SpringMVC 基本概念、SpringMVC 配置、SpringMVC 中的注解、SpringMVC 数据绑定。 MVC 简介 1、MVC 是一种架构模式 ...

September 7, 2016 · 5 min · 876 words · Me, LLM

刚刚毕业的两个月小结

走出校园已经两个月了,因为之前的暑期也没怎么在家待过,大一在中康、大二在腾骏、大三在大为,大四毕业也就是现在,所以也没有什么特别的感觉。可以说,这两个月也做了些事情,学了些东西的。 从学校毕业,最直接的影响就是自己更加专注于计算机知识,不用再为学业担心。确定了先走技术的道路,也让自己不那么迷茫做什么。工作规律,自己开始读读书,才觉的读书是件有意思的事。也逼着自己常常写点东西,主要是觉的:写东西的时候自己会主动的思考,文笔练着练着也就能进步吧。 (一) DMV 是毕业后自己第一个项目,全栈开发。初版两周上线,后有花了一周多的时间编写了答题记录的功能。其中的收获是:项目框架的搭建和前端入门知识。原来的项目搭建都不是自己做的,也一直觉的是一件很难的事情。也许就是因为没有做过才觉的难,做过之后也觉的不过如此。项目的页面不多,但都是自己一点点写的,HTML JS 原来也就是自己改改,没有完整写过,这次算是一次不错的锻炼。写前端的时候才发现现在的前端真的是日新月异 AngularJS React 好多好多自己都没有听过的东西,也是从 Mengqi 那里了解到了很多。可惜的是自己没有实际的用上这些,如有机会一定尝试。 DMV 项目流量平平,因为有 Domain 类项目的工作,DMV 的维护就暂时放置了,还是心有不舍的。期间和 John 聊过一次关于产品的事基本总结为: 产品项目是会有失败的,有流量的项目才有维护的意义。 大型项目只有成功与失败之分,没有中间项,失败将代价很大。 不一定要留住用户。 更小的成本更高的流量,高流量后就可以做很多的事。 (二) Domain 信息类项目,使用的架构和 DMV 一致,逻辑更加简单。自己主要做了数据整理,收获是关于 SQL 命令。SQL 就可以直接处理很多的事情。使用了 RMI 做数据同步,用反射写了一段程序,是一次有突破的尝试。 一次看到自己年初的简历,笑了。自己是真敢写,能写个 Hello World 就敢标成了解。从会用到原理,是接下要走的路。 (三) 最近在看设计模式和算法的书,一直在做 LeetCode 的题。设计模式没用过,逮到能用机会绝不错过。算法健脑,刚刚开始接触觉的挺有意思,对数据结构也是种了解。 (四) 再次参加舍友的婚礼,又个结婚了。大一奶了一口,现在成真。祝福 Lu&Feifei。 (五) 来说说程序员那无处安放的创造力 有了锤子想找钉子是很正常的原始冲动,但我们必须认识到,创造力对于程序员这个职业来讲,是锦上添花的东西。如果你没有强大的工程能力,那么创造力也不过是无本之木。所以扎扎实实的把工程基础打好,这是最根本的。 在此基础上,我比较推荐程序员采用内外两条线来培养自己。在公司内的项目上采取相对保守的策略,尽力把稳定性做到最好,培养出自己卓越的工程能力;然后在公司外的开源项目和自己的独立项目上,采用一些新的技术、实践一些新的想法、充分发挥自己的创造力,梦想还是要有的,对吧。 这样做最明显的好处是,你可以了解到新技术和激进方案的优缺点,从而在进行方案选型时,有更多的依据;还有一个职业发展上的好处:如果不是主负责人,公司的项目往往不能代表你的能力;但独立项目却可以作为一个非常好的能力证明出现在你的简历里边。 你可以是一个身怀绝技的手艺人,在自己家里你尝试各种手法各种风格的个人作品;但当你参与颐和园这种级别的工程时,好好的把自己负责的石头雕成总设计师要求的样子就好 —— 毕竟这个时代一个人已经很难负责整个项目了。这就是我所理解的程序员的工匠精神。 摘自:程序员到底是一个什么职业? (尾) 现在自己能听见进去一些原来听不去的话了。我不认为自己是被同化了,也许是心中少了些恶意。 状态不错,继续前进。 – EOF –

August 31, 2016 · 1 min · 59 words · Me

LeetCode Number of 1 Bits 191

191. Number of 1 Bits Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight). For example, the 32-bit integer ’11’ has binary representation 00000000000000000000000000001011, so the function should return 3. 大体意思 写一个函数,输入一个无符号整数,返回其中值为 1 的比特位的个数(这个值也被称为数字汉明重量) 自己的思路 循环判断最后一位是否是 1 public int hammingWeight(int n) { int result = 0; while (n != 0) { if ((n & 1) == 1) { result++; } n = n >> 1; } return result; } 在 Submit Solution ...

August 31, 2016 · 2 min · 237 words · Me