2
SELECT 
    t1.`id` , 
    t1.`some_key` ,  
    t1.`date` ,
    t2.`data`
FROM `table1` AS `t1`
    LEFT JOIN `table2` AS `t2` ON t2.`id` = t1.`some_key`
WHERE DATE( t1.`date` ) = DATE( NOW( ) )

今日追加されたtable1のすべてのレコードを検索しようとしています。レコード数がわかりません。日付列にINDEXを追加しようとしましたが、EXPLAINには、MySQLがtable1のn個すべての行を検索していることが示されています。

編集:::要求に応じて説明

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra 
1   PRIMARY     <derived2>  ALL     NULL    NULL    NULL    NULL    4   
1   PRIMARY     t2  eq_ref  PRIMARY     PRIMARY     4   t1.some_key     1   
2   DERIVED     table2  ALL     indx    NULL    NULL    NULL    5   Using where
4

2 に答える 2

6

t1.date で変換を行っています。クエリはすべての列を調べる必要があるため、インデックスの利点が失われます。t1.date は索引付けされている可能性がありますが、DATE( t1.date ) は索引付けされていません。

于 2012-06-15T20:05:02.657 に答える
1

クエリをリファクタリングしてみる

SELECT 
    t1.`id` , 
    t1.`some_key` ,  
    t1.`date` ,
    t2.`data`
FROM 
    (
        SELECT * FROM `table1`
        WHERE `date` >= (DATE(NOW()) + INTERVAL 0 SECOND)
    ) AS `t1`
    LEFT JOIN `table2` AS `t2`
    ON t2.`id` = t1.`some_key`
;

表情(DATE(NOW()) + INTERVAL 0 SECOND)は今日の真夜中

mysql> select (DATE(NOW()) + INTERVAL 0 SECOND);
+-----------------------------------+
| (DATE(NOW()) + INTERVAL 0 SECOND) |
+-----------------------------------+
| 2012-06-15 00:00:00               |
+-----------------------------------+
1 row in set (0.00 sec)

mysql>

これが2回目の試みです

SELECT 
    t1.`id` , 
    t1.`some_key` ,  
    t1.`date` ,
    t2.`data`
FROM 
    (
        SELECT id,somekey FROM `table1`
        WHERE `date` >= (DATE(NOW()) + INTERVAL 0 SECOND)
    ) AS t1
    INNER JOIN `table2` AS `t2` ON t1.`some_key` = t2.`id`;
;

table1 に (date,id,somekey) インデックスがあることを確認してください

ALTER TABLE table1 ADD INDEX date_id_somekey_index (`date`,id,somekey);

サブクエリは、インデックスに対する純粋な範囲スキャンです。NO TABLE ACCESS !!!

また、LEFT JOIN を INNER JOIN に変更しました。

少なくともサブクエリを調査するには、単独で実行します。

SELECT id,somekey FROM `table1`
WHERE `date` >= (DATE(NOW()) + INTERVAL 0 SECOND);

このサブクエリは、t1 の今日のエントリのみを生成します

于 2012-06-15T20:06:08.090 に答える