Php mysql查询耗时太长
此查询花费的时间太长,无法生成结果。在php页面中,它会创建500个内部服务器错误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
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