• mysql使用的坑


    一:

    mysql默认是安装记录的物理顺序取数据的,如果不加order by 排序,可能得不到预期的结果。

    (1) 获取 两个时间点的 id  (很快)

    $sql = ‘select id from apply_info where create_time< {$now} limit 1’;   (要加  order by id desc)

    获得 idNow

    $sql = ‘select id from apply_info where create_time>= {$yesterday} limit 1’ (要加 order by id asc)

    获得 idYt

    (2) 每次取 1000

    do{

           select user_mobile,user_from from apply_info where  id <= {$idNow} limit 1000;

           idNow -= 1000;

           //toDo

    } while (idNow >= idYt)

     二:

    当使用limit时,explain可能会造成误导

    (1)explain估计行数,不考虑limit,可能会对查询估计过多的检查行数

    (2)类似于SELECT ... FROM TBL LIMIT N这样的查询因为用不到索引将要报告为慢查询,(如果N不大,实际很快)

    配置文件设置min-examined-row-limit=Num of Rows,检查的行数>=这个量的查询才会被报告为慢查询,避免误判

    (3)类似于这样的select .. from tb where key_part1= ? order by key_part2 limit n,explain也要估计出过多的检查行数

    领导发的

    先说我认为好的方法,很希望有觉得不合理的地方直接发QQ群讨论

    1、    获取ID范围

    获取minId: select id from apply_info where create_time>= {$yesterday} order by create_time,id limit 1

    获取maxId: select id from apply_info where create_time< {$today} order by create_time desc,id desc  limit 1

    2、          循环获取

    while(1)

    {

           $sql = “select id,user_mobile,user_from from apply_info where  id >= $minId and id<=$maxId order by id limit 1000”;

           $ret = 执行sql

           foreach($ret as $row)//处理

    {

    }

           $minId = $row[‘id’];

           If(count($ret) < 1000) break;

    }

    几个容易有问题的地方:

    1、          王璐的获取id的方法,其实会扫描大块索引数据块,改进的方法其实是利用了create_time和id是一致的隐含信息

    2、          有同学用获取最大和最小id的时候,用的是= 号,但是该秒如果没有数据就会有问题了

    3、          limit m,n会导致扫描m+n行的记录,这块的问题大部分同学都发现了

    4、          根据create_time的索引每次获取1000行不好嘛?这里涉及到从索引获取到ID后还需要到数据部分去获取其他字段,需要更多的IO,这个和INNODB的聚簇索引结构相关。

  • 相关阅读:
    利用 innodb_force_recovery 解决MySQL服务器crash无法重启问题
    MySQL-5.7复制功能的默认设置改进
    MySQL explain
    MySQL服务器参数
    MySQL参数调优
    Oracle RAC(Real Application Clusters)
    MySQL show processlist 执行状态分析
    MongoDB 高可用集群架构简介
    docker网络
    centos 7.3镜像制作
  • 原文地址:https://www.cnblogs.com/hlongch/p/7262285.html
Copyright © 2020-2023  润新知