mysql的sql语句编写和优化

2019-02-22  本文已影响0人  APHOME_明


1)关联更新:update A,B set A.c1=B.c1,A.c2=B.c2  where A.id=B.id

    update A inner join B ON A.id=B.id SET A.c1=B.c1,A.c2=B.c2 where ...



Mysql查询优化考点

    1)查找分析查询速度慢的原因
    2)优化查询过程中的数据访问
    3)优化长难的查询语句
    4)优化特定类型的查询语句


一、分析SQL查询慢的方法
    1)记录慢查询日志
    2)分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,可以使用pt-query-digest工具进行分析

    使用show profile

    set profiling =1; 开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中。
    show profiles
    show profile for query 临时表ID
    
    使用show status
    
    show status会返回一些计数器,show global status查看服务器级别的所有计数
    有时根据这些计数,可以猜测出哪些操作代价较高或者消耗时间多

    show processlist
    观察是否有大量线程处于不正常的状态或者特征

    使用explain分析单条sql语句

二、优化查询过程中的数据访问
    1)访问数据太多导致查询性能下降
    2)确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
    3)确认mysql服务器是否在分析大量不必要的数据行
    
    避免使用如下sql语句
    1)查询不需要的记录,使用limit解决
    2)多表关联返回全部列,指定A.id,A.name,B.age
    3)总是取出全部列,SELECT * 会让优化器无法完成索引覆盖扫描的优化
    
    重复查询相同的数据,可以缓存数据,下次直接读取缓存
    
    是否在扫描额外的记录
    
    使用explain来进行分析,如果发现查询需要扫描大量的数据单只返回少数的行,可以通过如下技巧进行优化:
    1)使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果。
    2)改变数据库和表的结构,修改数据表的范式
    3)重新SQL语句,让优化器可以以更优的方式进行查询
    
    
三、优化长难的查询语句
        
    一个复杂查询还是多个简单查询
    MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多。
    使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询也是很有必要的,方便做缓存

    切分查询
    将一个大的查询分为多个小的相同查询;一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器的开销。

    
    分解关联查询
    可以将一条关联语句分解成多条SQL来执行,让缓存的效率更高。
    执行单个查询可以减少锁的竞争
    在应用层做关联可以更容易对数据库进行拆分

四、优化特定类型的查询语句

    1)优化count()查询
        count(*)中的×会忽略所有的列,直接统计所有的列数,因此不要使用count(列名)
        MyISAM中,没有任何where条件的count(*)非常快

上一篇下一篇

猜你喜欢

热点阅读