Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.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
Php mysql查询耗时太长_Php_Mysql_Internal Server Error - Fatal编程技术网

Php mysql查询耗时太长

Php mysql查询耗时太长,php,mysql,internal-server-error,Php,Mysql,Internal Server Error,此查询花费的时间太长,无法生成结果。在php页面中,它会创建500个内部服务器错误 SELECT DISTINCT tower_mac_address AS MAC_Address, tower_survey_no AS Survey_No FROM tower WHERE SUBSTR(REPLACE(tower_mac_address,':',''),7,6) NOT IN (SELECT DISTINCT deviceid FROM device_data WH

此查询花费的时间太长,无法生成结果。在php页面中,它会创建500个内部服务器错误

SELECT DISTINCT tower_mac_address AS MAC_Address, tower_survey_no AS Survey_No 
FROM tower 
WHERE 
SUBSTR(REPLACE(tower_mac_address,':',''),7,6) 
NOT IN 
    (SELECT DISTINCT deviceid FROM device_data 
    WHERE SUBSTRING(date_time,1,10)=CURRENT_DATE)

请帮助

您的查询非常糟糕。因为您使用的是SUBSTR(替换…),所以它不能在tower\u mac\u address列上使用索引。对于该内部查询,类似的情况是,您再次使用SUBSTR。不必这样做,您可以准备已经有SUBSTR(替换…)的新列,并在该列上添加索引


顺便说一句,当您计算应该用于内部WHERE的值时,不要使用子字符串来获取datetime的日期部分,而是使用函数。

您完全可以在子查询中去掉子字符串

SELECT DISTINCT deviceid FROM device_data 
WHERE SUBSTRING(date_time,1,10)=CURRENT_DATE;

--is the same as 
SELECT DISTINCT deviceid FROM device_data
WHERE `date_time` >=CURRENT_DATE AND `date_time`<CURRENT_DATE+INTERVAL 1 DAY;

从设备数据中选择不同的设备ID
其中子字符串(日期时间,1,10)=当前日期;
--与

从设备\u数据中选择不同的设备ID 其中'date\u time`>=当前日期和'date\u time`试试这个

SELECT DISTINCT tower_mac_address AS  MAC_Address, tower_survey_no AS Survey_No 
FROM tower LEFT JOIN
(SELECT DISTINCT deviceid FROM device_data WHERE SUBSTR(date_time,1,10)=CURRENT_DATE) d ON SUBSTR(REPLACE(tower_mac_address,':',''),7,6) = d.deviceid
WHERE d.deviceid IS NOT NULL

您的问题在于不在。MySQL在优化这方面做得很差。至少在文档中可以解释这一点

SELECT DISTINCT tower_mac_address AS MAC_Address, tower_survey_no AS Survey_No 
FROM tower t
WHERE  not exists
       (select 1
        from device_data dd
        where dd.deviceid = SUBSTR(REPLACE(t.tower_mac_address,':',''),7,6) and
              SUBSTRING(date_time,1,10)=CURRENT_DATE
       )
以下是其他建议:

  • 在device_data.deviceid上建立索引以加速子查询
  • 将日期\时间存储为日期时间数据类型,而不是字符串。这样,与当前\日期的比较不包括隐式转换
  • 如果“ToWaMaxAdvices”包含编码信息,考虑将其拆分为单独的字段。

  • 无论是
    何处子字符串(替换(列…)
    还是
    何处子字符串(列…)
    可以在MySQL中建立索引,因此您将完成一次完整的表扫描。添加存储这些表达式的预计算结果的附加列,对它们进行索引,并在这些条件下使用它们。从设备数据中选择不同的设备ID,其中日期时间介于日期(NOW())和日期(NOW()之间+间隔1天也使用了此功能。虽然速度太慢,但您是否在
    date\u-time
    上有索引?或者如果您在(
    date\u-time,deviceid
    )上有复合索引,效果会更好?我需要不在子查询中的设备的mac地址。即在当前日期处于非活动状态的设备的mac地址。这列出了所有mac地址OK抱歉我的错,然后您需要将最后一个条件更改为
    ,其中d.deveiceid为NULL