0

約8億のエントリを含む電子メールのテーブルがあり、それを約100,000の電子メールのリストと照合する必要があります。データベース内の電子メールエントリにインデックスが付けられます。

それを行うための最良のクエリは何でしょうか?照合したいエントリを使用して一時テーブルを作成し、それとメインテーブルに対してSELECTを実行しようとしましたが、それよりも高速である必要があるようです。複数のクエリの速度が低下しているようです。助言がありますか?

サーバーはCentOS6.3でMySQL5.5.27を実行しています。

編集:これが作成ステートメントです:

CREATE TEMPORARY TABLE temptable (Email varchar(50)) 
CREATE INDEX tempindex ON temptable (Email)

そして、これが私の質問です:

SELECT temptable.Email FROM temptable, biglist WHERE temptable.Email = biglist.Email

そして、これがEXPLAINの結果です。

+----+-------------+-----------+-------+---------------+-----------+---------+-----------------------+------+--------------------------+
| id | select_type | table     | type  | possible_keys | key       | key_len | ref                   | rows | Extra                    |
+----+-------------+-----------+-------+---------------+-----------+---------+-----------------------+------+--------------------------+
|  1 | SIMPLE      | temptable | index | tempindex     | tempindex | 53      | NULL                  |   21 | Using index              |
|  1 | SIMPLE      | biglist   | ref   | idx_Email     | idx_Email | 202     | datab.temptable.email |    1 | Using where; Using index |
+----+-------------+-----------+-------+---------------+-----------+---------+-----------------------+------+--------------------------+
4

1 に答える 1

1

次のようなものをお探しですか?

select emailaddress,
       (case when bg.emailaddress is NULL then 'MISSING' else 'PRESENT' end)
from TEMPemail te left outer join
     BigTable bg
     on te.emailaddress = bg.emailaddress

メールを一時的なテーブルに置くというあなたの考えは良いものです。一時テーブルにインデックスがあり、大きなインデックスがある場合は、クエリのパフォーマンスが向上する可能性があります。

于 2012-12-18T19:27:29.143 に答える