• SQL优化实战之加索引


     有朋友和我说他的虚机里面的mysql无法跑sql,但是在本地环境是这个sql是可以跑出来的。碰到这个问题第一反应是:死锁。

     于是让他查询数据库的几个状态:

     发现连即时锁都非常少,不是锁的问题。

    进一步排查,是否是系统瓶颈造成。

    使用top命令,发现了端倪:

    这是一个单核的服务器,cpu这么高,绝对有问题。登上mysql,发现只有14个线程,但都是在执行下面这个语句:

    select XX from orders c, area a, city y, province p, customers s, salers sa, sys_user us    where s.areaID = a.areaID  and s.provinceID = p.provinceID  and s.cityID = y.cityID  and c.customerid = s.id  and c.salerid = sa.id  and c.creatorid = us.USERID  and DATE_FORMAT(c.createtime,'%Y-%m-%d') >= '2016-06-01'  and DATE_FORMAT(c.createtime,'%Y-%m-%d') <= '2016-06-30'  order by c.statetime desc limit 0 , 10 ;

    这些线程的状态都是:Copying to tmp table 表的数据量并不大:

     首先调整了tmp_table_size有16M调整为160M。状态依然存在。

     随后执行 mysql>flush tables;尝试清掉进程,此操作被卡住;

     只能执行 mysql>kill pid号,kill掉查询进程;

     查看该语句的执行计划。发现全部是全表扫描,于是首先尝试在大表的关联字段上加索引:

     alter table area add index ind_areaid(areaid);
     alter table city add index ind_cityid(cityid);     

    再次查询,结果非常快了。除了加索引,这个SQL本身也是需要优化的。
    多表关联不是MySQL的强项。需要拆分成多个三个表以内的多表关联。

    加两个索引解决问题。

  • 相关阅读:
    __getitem__ 方法的使用
    python加载测试用例时,修改用例不必须以“test”开头
    python 反射
    python 类中__getattr__的使用
    python 中 __dict__函数的使用
    python 类中__int__和__str__的使用
    ubuntu16.04Nvidia驱动、CUDA、cuDNN安装与卸载
    C++中的各种可调用对象
    ubuntu16.04安装QGIS工具
    C/C++中extern关键字详解
  • 原文地址:https://www.cnblogs.com/janehoo/p/5492212.html
Copyright © 2020-2023  润新知