`
annan211
  • 浏览: 444903 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

mysql优化特定类型的查询

阅读更多
本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。

1 优化count查询
  对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看
  真正的count()函数的作用到底是什么。
  count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。
  在统计列的时候,要求列值是非空的,也就是说只统计有值得列的数量。由于大多数人对NULL的理解有限,
  所以并不能很深入的理解count()函数。
  count的另一个作用是统计结果集的行数,最简单的方法是count(*),当我们执行这一的查询的时候,优化器会
  忽略掉所有的列值而直接统计所有的行数,这样的定义更清晰性能也会更好,常见的错误是在括号内定义了一个列
  却希望统计结果集的行数。
  
  简单的优化
  现有查询语句 select count(*) from world.city where id >5;
  通过show status查看该查询需要扫描几千行数据,如果将条件翻转一下,先查找id<=5的数量,然后使用
  总数一减就能得到同样的结果,却可以将扫描的行数减少到5行以内。
  
  select (select count(*) from world.city) - count(*) from world.city where id <=5;
  这样可以大大减少需要扫描的行数,是因为在查询优化阶段会将其中的子查询直接当做一个常数来处理,
  可以查看其执行计划来验证。
  
  在大多数场景中并不要求一定要使用count统计出精确数据的行数,这时候我们要充分利用近似值,避免让数据库
  做更多的工作。即使迫不得已使用count计数,也要力求约束条件尽可能的简单,要删除掉distinct这样的约束来
  避免文件排序。
  
  快速、精确、实现简单 三者永远只能满足其二,必须舍弃其一。
  
2 优化关联查询
  1 确保on或者using字句中的列上有索引。在创建索引的时候就要考虑关联的顺序。
    当表A和表B用列C关联的时候,如果优化器的关联顺序是B、A的时候,那么就不需要在B表的
	对应列上建立索引。没有用到的索引只会带来负担。一般来说,除非有其他理由,否则只需要在关联顺序中的第二个
	表的相应列上创建索引。
  2 确保任何的group by 和order by中的表达式只涉及到一个表中的一列,
  
  
  
  
  
3  优化limit分页
      在进行分页操作的时候 我们通常会使用limit加上偏移量的办法实现,同时加上合适的order by子句,
	  如果索引使用的得当,通常效率都会不错。否则mysql将会做大量的文件排序操作。
	  一个非常常见又非常令人头疼的问题是,在偏移量非常大的时候,例如limit 10000,20
	  这时候mysql 需要查询 10020条记录然后只返回最后20条记录,前面10000条记录都将被抛弃,这样的代价非常高
	  如果所有的页面被访问的频率都相同,那么这样的查询平均需要访问半个表的数据。要优化这样的查询,
	  要么是在页面中限制分页的数量,要么是优化大便宜量的性能。
	  
	  优化此类分页查询的一个最简单的办法就是尽可能的使用索引覆盖扫描,而不是查询所有的列。然后再
	  根据需要做一个关联操作再返回所需要的列。对于偏移量很大的时候,这样做的效率会提升非常大。
	  
	  考虑下面的查询
	   select film_id,desc from film order by title limit 500,5;
	   
	   如果这张表非常大,那么最好修改一下
	   select film_id ,desc from film 
	        inner join(select film_id from film order by title limit 500,5)
			as lim using(film_id);
	   
	   这里的延迟关联将大大提升查询效率,他让mysql扫描尽可能少的页面,获取需要访问的记录后再根据关联
	   列回原表查询需要的所有列。这个技术也可以用于优化关联查询中的limit子句。
	   
	   也可以将limit查询转换为已知位置的查询,让mysql通过范围扫描获得到对应的结果。例如在一个位置上有索引,并且预先计算出了边界值,
	   上面的查询就可以改写为:
	     select film_id,desc from film where position between 500 and 504 order by position;
		 
	   当然我们还可以使用租借书签的方式来提高性能。
	   如果我们已经知道 需要返回的记录是主键在16029到16040之间的数据,那么下一页查询
	   就可以如下进行
	   select film_id ,desc from film where film_id < 16040 order by film_id desc limit 20;
	   因为我们已经使用书签记录下了最新一条数据的film_id 并且film_id主键是单调增长的,所以无论翻页到多后面其性能都是很好的。
	   
   4 优化union查询
       除非确实需要服务器消除重复的行,否则就一定要使用union all ,这一点非常重要。如果缺少all关键字
	   mysql会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性检查。这样做的代价非常高
	   即使有all关键字 mysql仍然会使用临时表存储结果。
  
  
  
  
  
  
  
  
  
  
  
  

   请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1

 

 

 

 

 

分享到:
评论
1 楼 u013280917 2015-07-03  
太深奥,看不懂

相关推荐

    高性能MySQL(第3版).part2

    6.7优化特定类型的查询236 6.7.1优化COUNT()查询236 6.7.2优化关联查询239 6.7.3优化子查询239 6.7.4优化GROUPBY和DISTINCT239 6.7.5优化LIMIT分页241 6.7.6优化SQL_CALC_FOUND_ROWS243 6.7.7优化UNION查询...

    MYSQL

    10.5.2 SELECT 查询的速度 10.5.3 MySQL 怎样优化WHERE子句 10.5.4 MySQL 怎样优化LEFT JOIN 10.5.5 MySQL 怎样优化LIMIT 10.5.6 INSERT查询的速度 10.5.7 UPDATE查询的速度 10.5.8 ...

    MySQL2023年高级面试题,中级面试题,大汇总.txt

    1,int(20)中20的涵义。...7、优化特定类型的查询语句 8、MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化? 9、MyISAM表格将在哪里存储,并且还提供其存储格式? 10、为什么要优化

    MySQL中文参考手册.chm

    10.5.2 SELECT 查询的速度 10.5.3 MySQL 怎样优化WHERE子句 10.5.4 MySQL 怎样优化LEFT JOIN 10.5.5 MySQL 怎样优化LIMIT 10.5.6 INSERT查询的速度 10.5.7 UPDATE查询的速度 ...

    MySQL中文参考手册

    * 1 MySQL的一般的信息 o 1.1 什么是MySQL? o 1.2 关于本手册 + 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o ...

    1,int(20)中20的涵义 2,为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树? 3、MySQL里记录

    1,int(20)中20的涵义。...7、优化特定类型的查询语句 8、MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化? 9、MyISAM表格将在哪里存储,并且还提供其存储格式? 10、为什么要优化

    mysql网络数据库指南(中文版) part1

    4.2 MySQL 查询优化程序 129 4.2.1 优化程序怎样工作 129 4.2.2 忽略优化 131 4.3 列类型选择与查询效率 132 4.4 有效地装载数据 134 4.5 调度与锁定问题 136 4.6 管理员的优化 137 4.6.1 服务器参数 138 ...

    10道精选MySQL面试题

    如何设计合适的索引来改善特定查询语句的性能? InnoDB存储引擎中行锁的类型有哪些?在什么场景下会使用共享锁和排他锁? 什么是死锁?MySQL如何检测和处理死锁? 分区表是如何工作的?在哪些场景下使用分区表能提升...

    MYSQL网络数据库PDF学习资源

    4.2 MySQL 查询优化程序 129 4.2.1 优化程序怎样工作 129 4.2.2 忽略优化 131 4.3 列类型选择与查询效率 132 4.4 有效地装载数据 134 4.5 调度与锁定问题 136 4.6 管理员的优化 137 4.6.1 服务器参数 138 4.6.2 硬件...

    基于 nodejs express mysql 开发的留言板 demo.zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

    基于C#试题库管理系统(MySQL).zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

    基于Java Swing + MySQL的图书管理系统.zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

    C++ Qt 基于数据库Mysql学生信息管理系统.zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

    基于Flask + MySQL的在线请假微信小程序.zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

    基于Jsp+Servlet+MySQL的会员管理系统.zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

    基于Java Swing + MySQL + JDBC 的图书管理系统.zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

    基于Java SpringBoot + mysql的在线图书展示商城。.zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

    Node、koa2、mysql 基于mpvue的网易严选商城.zip

    MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...

Global site tag (gtag.js) - Google Analytics