原创

mysql索引降维

温馨提示:
本文最后更新于 2018年03月31日,已超过 2,208 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

很多人都知道,mysql有索引这个概念,但是却很少去较真,如何利用索引去对数据降维,以提高查询速度。

举个常见的场景,那就是用户日志(订单),例如,在一家以电话推销为主的大型公司,有1000个员工,每天都得打出300个营销电话。我们做出以下数据特征模拟.

一个月内,有1000个员工号码,每人在8点-18点打出300个营销电话,打一个月

数据表sql:

CREATE TABLE \`dm_test\` (
  \`id\` int(11) NOT NULL AUTO_INCREMENT,
  \`phone\` varchar(13) DEFAULT NULL,
  \`to_phone\` varchar(13) DEFAULT NULL,
  \`add_time\` datetime DEFAULT NULL,
  PRIMARY KEY (\`id\`),
  KEY \`phone\` (\`phone\`),
  KEY \`add_time\` (\`add_time\`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

tp模拟生成数据代码:

public function test(){
    ignore_user_abort(true);
    set_time_limit(0);
    $add_arr = array();
    $b=0;
    for ($i=0;$i < 1000; $i++){
        $phone = '155'.mt_rand(10000000,99999999);//随机生成手机号
        $arr = array();
        $arr['phone'] = $phone;
        for($j=0;$j<30;$j++){//循环生成30天的数据
            $addtime = mt_rand(strtotime(date('Y-m-'.($j+1)))+8\*3600,strtotime(date('Y-m-'.($j+1)))+18\*3600);//随机8点-18点
            for($k=0;$k<300;$k++){
                $arr['to_phone'] = '155'.mt_rand(10000000,99999999);//随机生成手机号
                $arr['add_time'] = date('Y-m-d H:i:s',$addtime);//随机8点-18点
                $add_arr[] = $arr;
                $b++;
            }
            ob_flush();//刷新PHP自身缓冲区
            flush();//刷新(特指apache)web服务器的缓冲区,输出数据
        }
        if($i%2==0){
            $result = M('test')->addAll($add_arr);//批量新增
            echo '完成'.$i.'<br>';//输出状态
            $add_arr=array();
        }
    }
    echo $b;
}

这样,我们就有了一个存有9000万数据的数据表//生成时间有点慢

假设,我们要查询15585854115在2018-03-10至2018-03-29的记录,sql如下:

  

正文到此结束
本文目录