sql >> データベース >  >> RDS >> Mysql

MySql複合インデックス

    これが最初のクエリです:

    SELECT A.log_type, count(*) as distinct_count, sum(A.total_count) as total_count
    from (SELECT log_type, count(subscriber_id) as total_count
          FROM stats.campaign_logs
          WHERE domain = 'xxx' AND campaign_id = '12345' AND
                log_type IN ('EMAIL_SENT', 'EMAIL_CLICKED', 'EMAIL_OPENED', 'UNSUBSCRIBED') AND
                 DATE(CONVERT_TZ(log_time,'+00:00','+05:30')) BETWEEN DATE('2015-02-12 00:00:00') AND DATE('2015-02-19 23:59:58')
          GROUP BY subscriber_id,log_type) A
    GROUP BY A.log_type;
    

    次のように書く方がよいでしょう:

          SELECT log_type, count(DISTINCT subscriber_id) as total_count
          FROM stats.campaign_logs
          WHERE domain = 'xxx' AND campaign_id = '12345' AND
                log_type IN ('EMAIL_SENT', 'EMAIL_CLICKED', 'EMAIL_OPENED', 'UNSUBSCRIBED') AND
                 DATE(CONVERT_TZ(log_time, '+00:00', '+05:30')) BETWEEN DATE('2015-02-12 00:00:00') AND DATE('2015-02-19 23:59:58')
          GROUP BY log_type;
    

    これに関する最適なインデックスは、おそらく次のとおりです。campaign_logs(domain, campaign_id, log_type, log_time, subscriber_id) 。これは、クエリのカバーインデックスです。最初の3つのキーは、whereに使用する必要があります フィルタリング。



    1. MySQLは過去の日付(1200など)をサポートしていますか?

    2. SQLiteのGROUP_CONCAT

    3. SQLite RealvalsをJavaBigDecimal値に書き込むにはどうすればよいですか?

    4. タイムゾーンの問題にどのように対処しますか?