Есть ли способ оптимизировать этот код MySQL в PHP?

SELECT tblstud.studid,
tblsched.ip
FROM tblstud
LEFT JOIN tblstudsched ON (tblstud.studid=tblstudsched.studid)
LEFT JOIN tblsched ON (tblstudsched.schedid=tblsched.schedid)
WHERE tblstud.rfidid='".$rfid."'
AND tblsched.ip='".$ip."'
AND EXISTS
(SELECT tblsched.schedid
FROM tblsched
INNER JOIN tblstudsched
WHERE tblstudsched.schedid=tblsched.schedid
AND NOW() BETWEEN tblsched.timein AND tblsched.timeout)

Пока это мой код, и он предназначен для того, чтобы микроконтроллер Arduino отправлял данные в PHP. Это занимает у меня около 8 секунд, прежде чем другие данные должны быть приняты. Я не проверял сторону Arduino, но думаю, что это достаточно быстро, когда я выполнил другой запрос MySQL, но этот запрос относительно короче, чем приведенный выше.

Таблицы находятся в Inno DB, но я попробую MyISAM позже, так как последний лучше, когда есть больше чтений, чем добавление данных.

Типы данных Varchar с диапазоном от 3 до 30 символов каждый.

Я также уверен в скорости используемого ноутбука.

0

Решение

Это ваш запрос:

SELECT tblstud.studid, tblsched.ip
FROM tblstud LEFT JOIN
tblstudsched
ON (tblstud.studid = tblstudsched.studid) LEFT JOIN
tblsched
ON (tblstudsched.schedid = tblsched.schedid)
WHERE tblstud.rfidid = '".$rfid."' AND tblsched.ip = '".$ip."' AND
EXISTS (SELECT tblsched.schedid
FROM tblsched INNER JOIN
tblstudsched
ON tblstudsched.schedid = tblsched.schedid AND
NOW() BETWEEN tblsched.timein AND tblsched.timeout
);

Во-первых, LEFT JOIN во внешнем запросе нет необходимости, потому что WHERE условия просто превращают его в INNER JOIN тем не мение. Во-вторых, ваш EXISTS выглядит подозрительно Он просто смотрит, есть ли какие-либо активные графики вообще в данных. Таким образом, он собирается либо отфильтровать все, либо ничего. Возможно, вы намереваетесь:

SELECT tblstud.studid, tblsched.ip
FROM tblstud INNER JOIN
tblstudsched
ON (tblstud.studid = tblstudsched.studid) INNER JOIN
tblsched
ON (tblstudsched.schedid = tblsched.schedid)
WHERE tblstud.rfidid = '".$rfid."' AND tblsched.ip = '".$ip."' AND
EXISTS (SELECT 1
FROM tblsched
WHERE tblstudsched.schedid = tblsched.schedid AND
NOW() BETWEEN tblsched.timein AND tblsched.timeout
);

Тем не менее, я подозреваю, что вы хотите графики, которые соответствуют where условия. Если это так, это может быть логика, которую вы хотите:

SELECT tblstud.studid, tblsched.ip
FROM tblstud LEFT JOIN
tblstudsched
ON (tblstud.studid = tblstudsched.studid) LEFT JOIN
tblsched
ON (tblstudsched.schedid = tblsched.schedid)
WHERE tblstud.rfidid = '".$rfid."' AND tblsched.ip = '".$ip."' AND
NOW() BETWEEN tblsched.timein AND tblsched.timeout;

Если это подозрительно верно, то вы хотите индексы на tblstud(rfidid, studid), tblsched(schedid, ip, timein, timeout) и, конечно же, tblstudsched(studid, schedid), Обратите внимание, что это композитный индексы с несколькими ключами.

2

Другие решения

Других решений пока нет …