Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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_Indexing_Full Table Scan - Fatal编程技术网

MySQL查询不使用索引

MySQL查询不使用索引,mysql,indexing,full-table-scan,Mysql,Indexing,Full Table Scan,以下查询: EXPLAIN SELECT fdb . * , TIME_FORMAT( fdb.scheme, '%H:%i' ) AS scheme, TIME_FORMAT( fdb.actual, '%H:%i' ) AS actual, TIME_FORMAT( fdb.baggage, '%H:%i' ) AS baggage, TIME_FORMAT( fdb.baggage_handled, '%H:%i' ) AS bag

以下查询:

EXPLAIN 
SELECT 
    fdb . * , 
    TIME_FORMAT( fdb.scheme,  '%H:%i' ) AS scheme, 
    TIME_FORMAT( fdb.actual,  '%H:%i' ) AS actual, 
    TIME_FORMAT( fdb.baggage, '%H:%i' ) AS baggage, 
    TIME_FORMAT( fdb.baggage_handled,  '%H:%i' ) AS baggage_handled, 
    ff . * , TIME_FORMAT( ff.actual_saved,  '%H:%i' ) AS actual_saved, 
    TIME_FORMAT( ff.baggage_saved,  '%H:%i' ) AS baggage_saved, 
    TIME_FORMAT( ff.baggage_handled_saved,  '%H:%i' ) AS baggage_handled_saved, 
    ap.device_id, 
    ap.device_token, 
    ap.device_language, 
    ap.app_edition, 
    ap.receive_status_notifications, 
    ap.receive_time_notifications, 
    ap.receive_luggage_notifications, 
    ap.receive_gate_notifications, 
    ap.receive_runway_notifications, 
    ap.receive_plane_notifications
FROM flights_database fdb
    JOIN flights_followed ff ON fdb.flight_id = ff.flight_id
    JOIN apns_users ap ON ff.device_id = ap.device_id
                        AND ap.app_edition =  '1'
使用Explain后,很明显查询使用了表扫描:


有各种键,pusher\u idx同时包含设备id和航班id。为什么不使用此索引?

在这种情况下,mysql optimizer更改了表的顺序,它可以这样做-它们都是内部连接:


因此,只要所跟随的flights\u没有被任何具有新连接顺序的谓词过滤,它的其他表就会被连接到它,因此被过滤的是它们——它决定执行完全扫描。

我认为只有当您只引用索引字段时,索引才能用作索引。如果从同一个表中加入非索引字段,则会进行扫描。另外,函数调用会将索引分解为scan.SHOW创建表'apns_users`;,显示创建表'flights_followed'@爱德华:解决什么?您请求了一次完整扫描-mysql执行了它。如果您不想进行完整扫描,请将ff的一些谓词添加到被误解的位置或相关位置。谢谢在ff上添加WHERE仍然使用表扫描:@edwardmp:我没有说WHERE中的任何谓词都会阻止它进行完全扫描。你问了一个问题,我回答了。如果你在另一个问题上需要帮助,把它放到问题中或者问另一个问题。
SELECT 
    ...
FROM flights_followed ff
    JOIN flights_database fdb ON fdb.flight_id = ff.flight_id
    JOIN apns_users ap ON ff.device_id = ap.device_id
                        AND ap.app_edition =  '1'