0

select mysqlクエリでselectを最適化するための最良の方法はどれですか?

これは私の例です:

SELECT count(distinct email) 
FROM emails_stats 
WHERE DATE_FORMAT(time, '%Y-%m-%d') >= '2012-12-12' 
 and email in (SELECT email 
               FROM `reminder` 
               WHERE DATE_FORMAT(time, '%Y-%m-%d') = '2012-12-12')

私のデータベースには50万を超えるエントリがあります。

4

3 に答える 3

0
SELECT count(distinct emails_stats.email) 
FROM emails_stats 
JOIN reminder ON emails_stats.email= reminder.email
WHERE 
    emails_stats.time >= CAST('2012-12-12 00:00:00' AS datetime) AND
    (reminder.time BETWEEN CAST('2012-12-12 00:00:00' AS datetime) AND CAST('2012-12-12 23:59:59' AS datetime));

テーブルフィールドでdate_format()を使用する場合、mysqlは、値を指定された文字列と比較できるようにするために、そのdate_format()関数の結果を取得する必要があるため、テーブルの各行を調べる必要があります。高速化するには、「時間」フィールドのインデックスを作成し、代わりにこのクエリを使用します。そうすれば、mysqlはインデックスを検索するだけで必要な行を判別できます。

于 2013-01-10T23:23:48.190 に答える
-1

代わりにexists句を使用してください。

SELECT count(distinct email) 
FROM emails_stats 
WHERE DATE_FORMAT(time, '%Y-%m-%d') >= '2012-12-12' 
and exists (SELECT 1
                   FROM `reminder` 
                   WHERE emails_stats.email = `reminder`.email 
                   and DATE_FORMAT(time, '%Y-%m-%d') = '2012-12-12')
于 2013-01-10T22:44:01.207 に答える
-1

最良の方法は、次のようにここで結合を使用することです

SELECT count(distinct emails_stats.email) 
FROM emails_stats 
JOIN reminder ON emails_stats.email= reminder.email
WHERE DATE_FORMAT(emails_stats.time, '%Y-%m-%d') >= '2012-12-12';
于 2013-01-10T22:44:08.383 に答える