1.基本原则:优化数据访问

  (1)是否想服务器请求了不需要的数据?提取超过需要的列,多表连接时提取所有列,提取所有列都会消耗不必要的资源,提取你所需要的列就可以了。

  (2)MySQL检查了太多的数据吗?通过查看执行时间,查看检查和返回的行,查看检查的行和访问类型,用expain分析。

2.重构查询的方式

  (1)复杂查询和多个查询。将复杂的查询分解成多个简单的查询。

  (2)缩短查询。也就是分治法,每次只执行一小部分,以减少受影响的行数。

  (3)分解联接。把一个多表联接的查询分解成多个单查询,然后在应用程序端实现联接操作。

3.MySQL客户端/服务器协议

  半双工的,不能同时接收和发送。数据是有服务器端推送给客户端的。查询状态:休眠,查询,锁定,分析和统计,拷贝到磁盘上的临时表,排序结果,发送数据。

4.MySQL查询优化过程

  

  (1)解析------解析器

  (2)预处理----预处理器

  (3)优化------优化器->执行计划

    MySQL能够处理的一些优化包括:

    a.对联接中的表重新排序

    b.将外联接转换成内联接

    c.代数等价法则。

    d.优化count(),min(),max()

    e.计算和减少常量表达式。如果MySQL探测到一个表达式可以被简化成一个常量,那么它就会在优化期做这种转换。比如说,一个用户定义的变量如果没有变化,它就会被转化为一个常量。一些查询语句也会在优化过程被简化为常量。

    f.覆盖索引

    g.子查询优化

    h.早期终结。一旦满足查询或某个步骤的条件,MySQL就会立即停止处理查询,或者该步骤。最明显的例子就是limit

    i.相等传递

    j.比较in()里面的数据。MySQL会对in里面的数据排序,采用二分查找法查找。

    k.表和索引统计

  MySQL的联接执行策略

  优化限制:

    a.MySQL有时把子查询优化得很差,特别是where in。

    b.联合得限制

    c.索引合并优化

    d.相等传递

    e.并行执行

    f.哈希联接

    g.松散索引扫描

    h.MIN()和MAX()

    i.对同一个表进行select和update

(未完待续---------------------------------------------------)

  (4)查询执行

  (5)返回结果到客户端

5.优化特定类型的查询

  (1)优化cout。只使用一个查询统计同一列中不同值的数量,以减少查询的数量。例如:如果使用的是MyISAM存储引擎,因为它的每个表示记录了总行数的,

    select count(*) from  table where id >5;改成select (select count(*) from table)-count(*) from table where id <=5;会要少扫描很多行。

  (2)优化联接。确保on或using使用的列上有索引。确保goup by或order by只引用了一个表中的列。

  (3)优化子查询。尽量使用联接。

  (4)优化group by和distinct。

  使用临时表或文件排序进行分组。使用SQL_SMALL_RESULT强制MySQL选择临时表,SQL_BIG_RESULT强制MySQL选择文件排序。注意临时表示不能建索引的。在一个分组查询中,select子句使用非分组的列通常不是很好,因为结果可能不确定,可以使用SQL_MODE参数中加ONLY_FULL_GROUP_BY,这样服务器会对这样的查询产生一个错误信息。

  使用rollup优化group by。

  (5)优化limit和offset。

  一个简单的提高效率的方法是在覆盖索引上进行偏移,而不是对整行数据进行偏移。如下语句:

  select film_id,description from sakila.film order by title limit 50,5;

  改写成这样:

  select film.film_id.film.decription from salila.film inner join (select film_id from sakila.film order by title limit 50,5) as lim using(film_id);

  另一种方法是把limit转换成位置性查询,让服务器以索引范围扫描的方式来执行。

  (6)优化SQL_CALC_FOUND_ROWS。

  一种可以通过提取并缓存大量数据来优化,也可以通覆盖索引来优化。

  (7)优化联合。使用union all。

参考:《高性能MySQL》

mysql 查询 优化的更多相关文章

  1. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  2. mysql查询性能优化

    mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...

  3. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. mysql性能优化-慢查询分析、优化索引和配置

    一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connec ...

  5. MySQL SQL优化之in与range查询【转】

    本文来自:http://myrock.github.io/ 首先我们来说下in()这种方式的查询.在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效 ...

  6. Limit参数优化MySQL查询的方法

    在做一些查询时,总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的.那么,在mysql中有那些方式是可以避免全表扫面?除了通过使用索引列或分区等方式来进行 ...

  7. MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图

    http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...

  8. MySQL查询性能优化(精)

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  9. MySQL查询不使用索引汇总 + 如何优化sql语句

    不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...

随机推荐

  1. ajax dataType

    dataType 类型:String 预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 ...

  2. Service Broadcast简单音乐播放功能

    在Activity上有两个ImageButton,分别控制播放/暂停.停止. @Override    public void onCreate(Bundle savedInstanceState) ...

  3. Matplotlib基本图形之直方图

    Matplotlib基本图形之直方图 直方图特点 由一系列高度不等的纵向条形组成,表示数据分布情况例如年级同学身高分布注意与条形图的区别 示例代码: import osimport numpy as ...

  4. 原 jmeter中类似lr的场景设置

    有一天如果你们领导来一句给我测下这个首页到底能扛多少并发,并发量极限是多少,这时你不要慌不要忙,拿出jmeter神器,设置下场景,目标设置成1000,每10秒启动100个并发,等着看什么时候系统响应开 ...

  5. C/C++复杂类型声明

    曾经碰到过让你迷惑不解.类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明.   我们将从每天都能碰到的较 ...

  6. oracle create directory

    1.新建directory的语法 CREATE [OR REPLACE] DIRECTORY directory AS 'pathname'; 例如: create or replace direct ...

  7. 树形DP专题

    DP是我的弱项, 此专题意在总结树形DP的解题思路. 最小代价遍历一棵树 给定一棵带边权的树 $T=(V,E)$ , 遍历它 (树的每个节点都访问至少一次) 所需的最小代价. 这里的代价由具体问题所定 ...

  8. 凌乱的桌子和与 Web 的设计理念说明

    Python是一门脚本语言,因为能将其他各种编程语言写的模块粘接在一起,也被称作胶水语言.强大的包容性.强悍的功能和应用的广泛性使其受到越来越多的关注,想起一句老话:你若盛开,蝴蝶自来. 如果你感觉学 ...

  9. Jackson转换JSON例子

    Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象. 前面有介绍过json-lib这个框架,在线博文:http://www.cnblo ...

  10. ElasticSearch聚合aggs入门

    Elasticsearch是一款功能强大的开源软件,不仅可以检索排序,还可以对文档进行更复杂的操作--聚合. 1.单值聚合 Sum求和,dsl参考如下: { "size": 0, ...