Тогда уж сделайте таблицу с физ лицами отдельную а на неё ссылайтесь и из студентов и из преподавателей (если уж они и теми и теми могут быть). Ну и юзеров тогда с физлицами связывайте(если логин один и на препода и на студента)
ADD INDEX `t` (`date` ASC, `id` DESC) VISIBLE; или даже ADD INDEX `t` (`date` DESC, `id` DESC) VISIBLE; если и даты и id неубывают и мускуль достаточно умный
select user_id1, user_id2 from (
Select
user_id1, user_id2, 1 as flag
union all
Select
user_id2, user_id1, -1
) as t
group by user_id1, user_id2
having sum(flag) = 0
between начало дня and конец дня и union all на каждую дату.
Вариант с диапазонами (2018-06-19 00:00:00 - 2018-06-19 23:59:59) для каждого дня пока не пробовал, считаю это костылём, который по предчувствию так же будет тормозить.
Ввести дополнительное поле "версия", и при записи его увеличивать. Ну а перед записью проверять, чтобы версия совпадала с редактируемой. Это называется "Оптимистическая блокировка".
Не может 500к записей в таких запросах работать больше 2 часов. при 500 к записей даже при тэйбл скан это будет в диапазоне минут (размер строки не более пол килобайта, соответственно, 250 мегабайт на таблицу, что примерно 10-30 секунд на 5400 хдд на запрос селект и апдейт). Ну, или машина совсем старая или виртуалка, ужатая по ресурсам.
В данном случае посоветую сделать таблицу с индексом по хэшу урл (для ограничения длины колонки с индексом) и проверять его. В зависимости от бизнес логики может быть можно сократить запрос до insert .. on duplicate key update
Добавьте промежуточную таблицу с данными в нужном виде, обновляйте кодом при апдейте основной таблицы/триггером/по расписанию. Денормализация - нормальный прием повышения производительности.
эксель вообще отвратительно работает с csv. проще всего открыть с помощью libre office calc и сохранить в эксель, или открыть пустую таблицу экселя, выбрать данные - из текста - и пройти по шагам мастера.
Разве mysqli_insert_id(); возвратит не тот id, который был создан в текущем соединении? И тогда гипотетическое другое соединение никак на него не повлияет.
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
В данном случае очень подозрительно ='$id'
во первых - это может быть путь к sql injection, во вторых - подозрительные кавычки. попробуйте вывести фактический запрос и выполнить его в phpmyadmin.
Ну и mysql - deprecated, используйте PDO/mysqli. И не используйте запросы в цикле.