表的数据很大筛选问题

当条件很大时,我们就不要用IN了。因为那样我们的sql语句就会很大,解决方法用临时表和 左连接加索引

public function run($daily = ‘‘){
        $daily = is_numeric($daily) ? date(‘Y-m-d‘, $daily) : $daily;

        if(empty($daily)){
            $daily = date(‘Y-m-d‘, time() - (60*60*24));
        }

        // 创建临时表
        $this->salesDailySales->execute("DROP TABLE IF EXISTS 000_sales_p");
        $sql = "CREATE TABLE 000_sales_p
                SELECT orders_id,orders_platform,orders_import_date
                FROM  orders
                WHERE  orders_import_date=‘".$daily."‘
                AND  orders_status NOT IN (‘900‘,‘100‘)";
        $returnInfo = $this->salesDailySales->execute($sql);

        if($returnInfo !== false){
            // 给临时表添加索引
            $this->salesDailySales->execute("ALTER TABLE 000_sales_p ADD INDEX (orders_id)");

            // 生成临时表 000_tmp_op
            $this->salesDailySales->execute("DROP TABLE IF EXISTS 000_tmp_op");
            $returnInfo = $this->salesDailySales->execute("CREATE TABLE
                                000_tmp_op
                            SELECT
                                p.orders_platform,p.orders_import_date,
                                op.orders_product_quantity, op.product_id,
                                op.orders_item_total_price_usd,
                                IF(op.product_attr_code=99,1,op.product_attr_code) as product_attr_code
                            FROM
                                000_sales_p p
                            LEFT JOIN
                                orders_product op
                            ON
                                p.orders_id = op.orders_id"
            );

            if($returnInfo !== false){

                // 添加 索引 product_id,product_attr_code
                $this->salesDailySales->execute("ALTER TABLE  000_tmp_op ADD INDEX (product_id)");
                $this->salesDailySales->execute("ALTER TABLE  000_tmp_op ADD INDEX (product_attr_code)");
                $sql = "
                    INSERT INTO
                        sales_daily_sales(product_attr_id,product_id,orders_platform,sales_daily_sales_date,daily_sales_qty,daily_sales_gmv)
                    SELECT
                        pa.product_attr_id, pa.product_id,
                        op.orders_platform, op.orders_import_date, SUM( op.orders_product_quantity ),
                        SUM(op.orders_item_total_price_usd)
                    FROM
                        000_tmp_op op
                    LEFT JOIN
                        product_attr pa
                    ON
                        pa.product_id = op.product_id
                    AND
                        pa.product_attr_code = op.product_attr_code
                    GROUP BY
                        op.orders_import_date, op.orders_platform, product_attr_id";

                // 添加数据之前 要删除同一天的数据
                $map = array();
                $map[‘sales_daily_sales_date‘] = $daily;
                $this->salesDailySales->where($map)->delete();

                // 导入数据
                $returnInfo = $this->salesDailySales->execute($sql);

                // 删除临时表
                $this->salesDailySales->execute("DROP TABLE IF EXISTS 000_tmp_op");
                $this->salesDailySales->execute("DROP TABLE IF EXISTS 000_sales_p");

                if($returnInfo !== false){
                    return true;
                }
            }

        }
时间: 2024-10-20 07:54:40

表的数据很大筛选问题的相关文章

? ?如果表的数据量大,那为了加快读(sel人民网评:明星片酬为

RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.光在外面分配了硬盘空间给虚拟机是不行的,还要进去操作一下,这里下个图形界面的工具,方便操作.sudo a-ge insall gared启动的时候报错,说a sar imor androidconenConex; imor androidexEdiable; imor androidexSelecion; imor androidexSann

hdu 1690 构图后Floyd 数据很大

WA了好多次... 这题要用long long 而且INF要设大一点 Sample Input2 //T1 2 3 4 1 3 5 7 //L1-L4 C1-C4 距离和花费4 2 //结点数 询问次数1 //结点的横坐标2341 4 //起点 终点4 11 2 3 4 1 3 5 74 1123101 4 Sample OutputCase 1:The minimum cost between station 1 and station 4 is 3.The minimum cost betw

对于有些数据很大又可以用数组将运算结果.1

http://www.codecademy.com/pji7j44zo/codebits/b0nZQc http://www.codecademy.com/pji7j44zo/codebits/Trhx5r http://www.codecademy.com/pji7j44zo/codebits/Iz3xKA http://www.codecademy.com/pji7j44zo/codebits/Uj2fiQ http://www.codecademy.com/pji7j44zo/codebi

删除大表的数据:普通删除语句和游标处理的比较

一.前言 WHERE条件用不到索引的情况下如何删除大表记录?文章中只是列举出其中一种方式而已,但仍然存在很多不严谨的地方.只是 轻描淡写随着数据表越来越大,历史数据的处理将越来越困难.且过滤字段没有索引(如时间)字段,而创建索引是需要临时表空间排序的.有越来越大,创建的维护工作也随之越来越难. 除了本文介绍的方法以外,还可以通过以下几种方法来维护历史数据: 1. 创建历史表,将历史数据定期移至历史表,让源表保持"瘦小身材"(源表会有碎片,需要定期对表和索引进行重建) 2. ORACLE

记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的.很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了.第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒.你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对

Zabbix的history相关数据表数据太大,执行表分区操作过程

一.查询zabbix数据库大小 mysql> select table_schema, concat(truncate(sum(data_length)/1024/1024,2),' mb') as data_size,concat(truncate(sum(index_length)/1024/1024,2),'mb') as index_size from information_schema.tables group by table_schema order by data_size d

创建一个很大的EMP表 EMP_LARGE

--CREATE TABLE EMP_LARGE AS SELECT * FROM EMP ; ---先复制一张EMP表 DECLARE --声明变量 v_loop NUMBER; v_num NUMBER; too_large EXCEPTION; BEGIN --开始执行 FOR v_loop IN 1 .. 100 LOOP --EMP开始是14条,14*2^100应该是很大的数了吧 SELECT COUNT(*) INTO v_num FROM emp_large; IF v_num <

关于数据量很大的题目

这段时间写多校,碰到很多数据量很大的题目,有的有规律,有的需要一定的预处理以及一些好玩的算法.那么怎么区分呢?首先看下题目给的限时,如果比较多,那么就需要一定预处理啦:再就是看下rank,如果一道题目突然很多人短时间写出来,一定是规律题,而且是巧妙的规律题.在说一下关于贡献这个东西,有些题目需要枚举,我们在枚举的时候,通常题目表面信息给的枚举是满足不了时间复杂度的,所以我们需要选取合适的枚举对象..这个也很重要.