正 文:

SQL语句的优化大有学问,不同的写法取得的效果大为不同。今例举limit和count语句来作下探讨
1, limit语句的优化 。
常见的limit语句的形式为:LIMIT m,n;随之偏移量m的增大,limit语句的执行效率也跟着下降。所以,优化limit的原则是尽量不要使用偏移量m,将limit m,n转换为limit n的形式,万一非要使用偏移量m,也要m尽可能的小。 现在,从表items表中,找出10000之后的10条记录。一般的查找方法如下:
mysql> explain select ItemID,ItemName,Code from items  limit 10000,10;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
|  1 | SImpLE      | items | ALL  | NULL          | NULL | NULL    | NULL | 22116 |       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
1 row in set (0.00 sec)
索引类型为ALL,而且是全表扫描,影响的行数整张表的记录总数。可见是对全行数据进行偏移。 一个简单的技巧是对索引数据进行偏移,然后将索引数据与全行数据内联,得到所需的列。语句如下:
mysql> explain select ItemID from items INNER JOIN (select ItemID from items order by ItemID LIMIT 10000,10) AS items2 USING(ItemID);
+----+-------------+------------+--------+---------------+---------+---------+---------------+-------+-------------+
| id | select_type | table      | type   | possible_keys | key     | key_len | ref           | rows  | Extra       |
+----+-------------+------------+--------+---------------+---------+---------+---------------+-------+-------------+
|  1 | PRIMARY     |  | ALL    | NULL          | NULL    | NULL    | NULL          |    10 |             |
|  1 | PRIMARY     | items      | eq_ref | PRIMARY       | PRIMARY | 4       | items2.ItemID |     1 | Using index |
|  2 | DERIVED     | items      | index  | NULL          | PRIMARY | 4       | NULL          | 10010 | Using index |
+----+-------------+------------+--------+---------------+---------+---------+---------------+-------+-------------+
3 rows in set (0.00 sec)
上述查询影响的rows书只有10010,查询中对索引ItemID进行了排序。 还有一种查找方法,使用子查询,转换为limit n形式。如下
mysql> explain select ItemID,ItemName,Code from items where ItemID >= 10000  order by ItemID limit 10;
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows  | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
|  1 | SImpLE      | items | range | PRIMARY       | PRIMARY | 4       | NULL | 13563 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
1 row in set (0.00 sec)
如果可以确定记录的具体位置,也可以使用between….and…来达到效果 mysql> explain select ItemID,ItemName,Code FROM items where ItemID between 10000 and 10010 order by ItemID;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SImpLE      | items | range | PRIMARY       | PRIMARY | 4       | NULL |    8 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 2  count语句的优化
count语句不好做优化,只有写特例,在没有使用where语句的count查询,非常快。也就是select count(*) from items 现在,查询items表中,ItemID大于2的所有记录。sql语句如下: +----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
|  1 | SImpLE      | items | index | PRIMARY       | PRIMARY | 4       | NULL | 22114 | Using where; Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
1 row in set (0.00 sec)
对比如下查询 mysql> explain  select (select count(*) from items) - count(*) from items where ItemID <= 2;
+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                        |
+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+
|  1 | PRIMARY     | items | range | PRIMARY       | PRIMARY | 4       | NULL |    1 | Using where; Using index     |
|  2 | SUBQUERY    | NULL  | NULL  | NULL          | NULL    | NULL    | NULL | NULL | Select tables optimized away |
+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+
2 rows in set (0.00 sec)
第一句查询影响了>2的所以行,第二句查询影响了<=2的所以记录。关键区别在(select count(*) from items) - count(*)来计算行数和where条件的不同。 还有一个有趣的地方,如果要统计同一列中不同值的记录数。如items表里产品上架(1)和下架(0)的不同数量。有两种查找方法,一种是使用count,一种是使用sum函数。 mysql> explain select count(isActive = '1' or null) as up,count(isActive = '0' or null) as down from items;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
|  1 | SImpLE      | items | ALL  | NULL          | NULL | NULL    | NULL | 22116 |       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
1 row in set (0.00 sec)
mysql> explain select sum(if(isActive='1',1,0)) as up,sum(if(isActive='0',1,0)) as down from items;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
|  1 | SImpLE      | items | ALL  | NULL          | NULL | NULL    | NULL | 22116 |       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
1 row in set (0.00 sec)

MYSQL语句优化:limit和count的优化相关推荐

  1. mysql分页语句解释,mysql语句分页limit什么意思

    mysql语句分页limit什么意思 主要是取数据条数用的 比如取前几条或者中间某几条数据 举两个例子吧 limit 10 (limit 0,10的缩写)这个表示取前十条 limit 2,10 从第三 ...

  2. mysql关于group by加count的优化

    很多时候我们需要查询类似于所有人做题量之类的查询,一般第一时间想到的会是group by 加count,这个在数据量不大的情况下还没问题,但数据达到百万级别就会是很大的问题,因为group by的字段 ...

  3. mysql 优化表 3000万_mysql优化:专题三、关于单表查询,可以这么优化

    mysql优化:专题三.关于单表查询,可以这么优化 作者:PHPYuan 时间:2018-10-18 03:41:26 上篇讲解了「mysql优化专题」90%程序员都会忽略的增删改优化(2),相信大家 ...

  4. mysql的count(*)的优化,获取千万级数据表的总行数

    一.前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去.找了很多优化方案,最后另辟蹊径,选择了用explain来获取总行数. 二.关于cou ...

  5. mysql innodb count_MySQL下INNODB引擎的SELECT COUNT(*)性能优化及思考

    正 文: MySQL下INNODB引擎的SELECT COUNT(*)性能优化及思考 最近有项目有高并发需求,服务器采用负载均衡,数据库采用阿里云的RDS MYSQL,16核64G内存,连接数:160 ...

  6. mysql无序id怎么优化limit_MYSQL分页limit速度太慢优化方法

    原标题:MYSQL分页limit速度太慢优化方法 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦. 当一 ...

  7. mysql 5.622_新特新解读 | MySQL 8.0 对 count(*)的优化

    我们知道,MySQL 一直依赖对 count(*) 的执行很头疼.很早的时候,MyISAM 引擎自带计数器,可以秒回:不过 InnoDB 就需要实时计算,所以很头疼.以前有多方法可以变相解决此类问题, ...

  8. mysql 语句优化的十个经验

    mysql 语句优化的十个经验mysql 语句优化的十个经验 本文算是前一篇 查询语句优化经验总结1的后续,总结了<高性能mysql>中与网上常见的一些优化经验中出现的案例进行总结与勘误. ...

  9. MySQL中的limit分页优化

    MySQL中的limit分页优化 MySQL的limit优化 mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,my ...

最新文章

  1. 跨域、ContentType组件
  2. ATPG Practice ATPG Practice II
  3. java卡片布局源码_Java编程使用卡片布局管理器示例【基于swing组件】
  4. 2011年全国大学生程序设计邀请赛(福州)
  5. 地理信息系统概论_地理信息系统概论黄杏元第3版配套练习题库——才聪学习网...
  6. CSDN2013博客之星评选(求投票支持)
  7. 微信小程序|开发实战篇之request请求(单个、多个参数,json对象,header)
  8. HttpServletResponse类
  9. java实现文件的移动
  10. 公共邮箱,共享邮箱,免费邮箱,匿名邮箱,临时邮箱,免费收信
  11. PID算法原理及基本实现
  12. docker 启动 redis cluster,使用出现CLUSTERDOWN Hash slot not served(redis cluster重新分配slot)
  13. U8 用友 ERP 库存查询SQL
  14. 英特尔的指令集体系结构_VLIW指令集架构 cpu指令集跟架构的区别
  15. 【模拟器】Android Studio模拟器运行自己的编译的Android源码镜像
  16. mysql 标识列是什么,mysql中标识列是什么意思有什么用
  17. GPU和CPU跑程序的代码区别
  18. xms和xmx为什么要相同_为什么结婚蚕丝被,一定要有双宫茧子母被?
  19. Alfresco 4.0安装手把手教程
  20. NAO6机器人python环境完整搭建

热门文章

  1. 如何免费开通微信公众号留言功能(下)
  2. oracle 12c基本管理,oracle 基本管理
  3. Git——git的简单使用以及连接gitee的远程仓库[经验 y.2]
  4. 计算机硬盘做u盘启动不了,u盘启动盘读不出来硬盘如何解决_电脑U盘启动找不到硬盘的解决教程...
  5. 讲讲自己一天入门Python的一些心得
  6. H5网站-微信浏览器中打开底部fixed遮住内容区域问题
  7. 谷歌优化排名怎么做?Google SEO怎么优化?
  8. 秒云“生活梦想家”计划,从一杯手冲开启
  9. k8s 1.20,IPv4/IPv6 双协议栈
  10. MapReduce重点知识