美文网首页
mysql的sql语句编写和优化

mysql的sql语句编写和优化

作者: APHOME_明 | 来源:发表于2019-02-22 17:04 被阅读0次
    
    
    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(*)非常快
    
    

    相关文章

      网友评论

          本文标题:mysql的sql语句编写和优化

          本文链接:https://www.haomeiwen.com/subject/zlneyqtx.html