Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 简单:是什么使得这个查询效率低下?_Mysql_Join_Indexing - Fatal编程技术网

Mysql 简单:是什么使得这个查询效率低下?

Mysql 简单:是什么使得这个查询效率低下?,mysql,join,indexing,Mysql,Join,Indexing,我试图搜索今天添加的表1中的所有记录。我不知道记录的数量。我尝试在date列中添加一个索引,但是我的解释仍然显示MySQL搜索了表1中的所有n多行 编辑:::按要求解释 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

我试图搜索今天添加的表1中的所有记录。我不知道记录的数量。我尝试在date列中添加一个索引,但是我的解释仍然显示MySQL搜索了表1中的所有n多行

编辑:::按要求解释

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( ) )
id选择类型表类型可能的键长度参考行额外
1主所有空4
1初级t2均衡参考初级4 t1。一些关键1
2派生表2所有indx NULL 5使用其中

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

尝试重构查询

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
表达式
(DATE(NOW())+间隔0秒)
是今天的午夜

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`
;
这是第二次尝试

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>
请确保表1有(日期、id、somekey)索引

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

我还将左连接更改为内部连接

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

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

此子查询将只生成t1的当前条目

是否有日期的索引?即使有,也最好不要在表上使用
date()
函数,而使用
WHERE t1.date>date(NOW())
My 0.02:鉴于您转换索引数据的事实,因此无法事先知道结果。结果:全扫描索引或无索引仍会进行全扫描。你会怎么做呢?这实际上会使它运行得更慢(甚至是微秒),因为它会增加子查询的额外开销。这不会提高相关查询的性能。再加上归还一切(*)也无济于事;)是的,它仍然扫描了派生表1上的所有行。请创建建议的索引,在我的第二个查询中运行解释计划,并在您的问题中发布输出。完成谢谢:)。顺便说一句,表1中有5行。只有4行有今天的日期。请运行我的第二个查询,并告诉我它是否运行得快。我尝试以internval+0秒的速度执行此操作,但它仍然扫描所有行。您已经找到了。不要转换日期列,而是搜索t1.date>=date(NOW())和t1.dateALTER TABLE table1 ADD INDEX date_id_somekey_index (`date`,id,somekey);
SELECT id,somekey FROM `table1`
WHERE `date` >= (DATE(NOW()) + INTERVAL 0 SECOND);