很简单:是什么让这个查询效率低下


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( ) )

我正在尝试搜索今天添加的表1中的所有记录。 我不知道记录的数量。 我尝试在日期列中添加一个索引,但我的解释仍然显示MySQL搜索表1中的所有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

您正在 t1.date 上进行转换;您失去了索引的好处,因为现在您的查询需要查看每一列。 t1.date 可以被索引,但 DATE( t1.date ) 不是。

尝试重构查询

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>

这是第二次尝试

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`;
;

请确保表1有一个(日期,id,somekey)索引

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

子查询是对索引的纯范围扫描,无表访问

!!

我还将左联接更改为内联接。

要至少调查子查询,请单独运行它:

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

此子查询将仅生成 t1 的今天条目

最新更新