zoukankan      html  css  js  c++  java
  • mysql 查询 优化

    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》

  • 相关阅读:
    unit3d 4.6 document open solution
    Unity3dBug
    linq to xml
    A const field of a reference type other than string can only be initialized with null Error [duplicate]
    Redis数据类型
    redis快照与AOF
    redis实现高并发下的抢购/秒杀功能
    xss攻击怎么防止
    四种常见的索引类型
    什么是sql 注入及如何预防 sql 注入
  • 原文地址:https://www.cnblogs.com/zhutianpeng/p/4222517.html
Copyright © 2011-2022 走看看