下面我来举一个 简单的例子。
考虑如下 表结构:
/*DDL
Information For - t_girl.t_page_sample*/
----------------------------------------------
Table Create
Table
-------------
----------------------------------------------------------------
t_page_sample CREATE TABLE `t_page_sample`
(
`id`
int(10) unsigned NOT NULL,
`v_state` tinyint(1) NOT NULL DEFAULT '1',
`log_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
我的测试系统为标配DELL D630, XP系统。
示例表的记录数:
select count(*) from
t_page_sample;
<!-->
query result(1 records)
下面我们 来一步一步看看下面的这条语句:
explain
select sql_no_cache * from t_page_sample order by id asc limit
900001,20;
<!-->
<!-->
query result(1 records)
id |
select_type |
table |
type |
possible_keys |
key |
key_len |
ref |
rows |
Extra |
1 |
SIMPLE |
t_page_sample |
ALL |
(NULL) |
(NULL) |
(NULL) |
(NULL) |
993098 |
Using filesort |
从
上面可以看出,她没有用到任何索引,扫描的行数为993098,而且用到了排序!
select sql_no_cache * from
t_page_sample order by id asc limit 900001,20;
(20
row(s)returned)
(4688 ms taken)
那么我们怎么优化这条语句呢?
首先,我们想到的是索引。
在这条语句中,只有ID可能能用到索引,那么我们给优化器加一个暗示条件,让他用到索引。
select sql_no_cache * from t_page_sample force index (primary)
order by id
asc limit 900001,20;
(20 row(s)returned)
(9239 ms taken)
没想到用的时间竟然比不加索引还长。 看来这条路好像走不通了。
我们尝试着变化下语句如下:
select * from t_page_sample
where id
between
(select
sql_no_cache id from t_page_sample order by id asc limit 900001,1)
and
(select sql_no_cache id
from t_page_sample order by id asc limit 900020,1);
(20 row(s)returned)
(625 ms taken)
哇,这个很不错,足足缩短了将近15倍!
那么还有优化
的空间吗?
我 们再次变化语句:
select * from t_page_sample
where id >= ( select sql_no_cache id from t_page_sample order
by id asc limit 900001,1)
limit 20;
(20
row(s)returned)
(406 ms
taken)
时间上又比上次的语句缩短了1/3。可喜可贺。
分享到:
相关推荐
Mysql基础语法及脚本,非常适合新人学习,里面有2个Demo及脚本,第一个适合完全不会的新人,通过学习Demo1,能掌握简单的增删改查,通过学习Demo2,能掌握mysql运算符,排序,用limit分页查询,MySQL正则表达式,约束,索引,函数...
总的来说,MySQL LIMIT分页查询的优化主要集中在减少不必要的行扫描、利用索引以及采用更适合大数据量的查询策略。通过这些方法,可以显著提升分页查询的性能,尤其是对于那些需要跳过多行的情况。在实际应用中,应...
Limit语法: 复制代码 代码如下:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是一个整数常量。...
MySQL语法语句是数据库管理和数据操作的核心工具,适用于各种应用场景,从简单的数据查询到复杂的数据库设计。本篇文章将详细介绍MySQL中的几个关键语法,包括创建表、创建索引、改变表结构、删除数据对象以及执行...
MySQL中的`LIMIT`子句是用于限制SQL查询返回的行数,特别适用于分页查询,即在网页或其他界面中按页显示数据。然而,当处理大量数据时,不恰当的`LIMIT`使用可能会导致显著的性能下降。以下是对`LIMIT`性能优化及...
本文将深入探讨MySQL的操作与语法,旨在帮助读者理解和掌握在MySQL环境中进行数据库管理和数据操作的关键技巧。 一、MySQL安装与配置 安装MySQL通常涉及下载适合您操作系统的二进制文件,然后按照安装向导的步骤...
本知识点将对给定文件中出现的MySQL语法进行详细解读。 首先,从文件内容中可以看到,创建表(CREATE TABLE)是数据库操作中的一个基础任务。MySQL中创建表的语法可以包括表名、列名以及列的数据类型,并且可以指定...
MySQL 是一种广泛使用的开源关系型数据库管理系统,它的语法丰富多样,涵盖了许多功能。以下是一些基本的MySQL语法和操作: 1. **数据库管理**: - 显示所有数据库:`SHOW DATABASES;` - 创建数据库:`CREATE ...
MySQL是一种广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于使用的特点,成为了许多企业和开发者...通过阅读"数据库1.pdf", "数据库2.pdf", 和 "数据库3.pdf",你可以深入理解并掌握更多关于MySQL的知识。
本参考大全将深入探讨MySQL的SQL语法,帮助用户更好地理解和运用这个强大的数据库系统。 一、SQL基础 SQL,全称Structured Query Language(结构化查询语言),是用于管理关系数据库的标准语言。MySQL支持SQL的...
### MySQL的基本语法详解 #### 一、创建表 在MySQL中,**表**是最基本的数据存储单元,通过创建表来组织和存储数据。创建表的基本语法如下: ```sql CREATE TABLE table_name ( column_name datatype [NOT NULL ...
Mysql limit分页语句用法 与Oracle和MS SqlServer相比,mysql的分页方法简单的让人想哭。 –语法: SELECT * FROM table LIMIT [offset,] rows ...如何优化limit 当一个查询语句偏移量offset很大的时候,如select * fr
SQL数据库不支持limit语法,利用逻辑处理函数模拟出来的思路,具体可照此改造。
以下是一些关于MySQL语法的关键点: 1. **创建表**: - 使用`CREATE TABLE`语句来创建新的表。表由列(column)组成,每个列都有指定的数据类型,如`INT`、`VARCHAR`等,并可以通过`NOT NULL`来指定该列不允许为空...
在这个“MySQL基础语法与练习”的主题中,我们将深入探讨MySQL的基础语法,并通过大量的练习来巩固你的理解。 一、MySQL安装与配置 在开始学习MySQL之前,你需要在你的计算机上安装MySQL。这通常可以通过下载并运行...
在MySQL数据库操作过程中,`LIMIT`子句是非常实用的一个功能,尤其是在需要限制查询结果集大小的情况下。本文将详细介绍如何在MySQL中使用`LIMIT`结合参数化查询来实现灵活且安全的数据检索。 #### 一、基础知识...