Хорошо.Прежде всего, только с 1М строк это не должно занимать 20 минут.Больше похоже на 20 секунд.Если ваш столбец rownum уникален, он должен быть проиндексирован как уникальный ключ.Это также должно быть без знака int.Выполнение этих действий значительно сократит время вашего запроса, потому что кажется, что сейчас вы выполняете полное сканирование несортированной таблицы для каждого соединения.
Во-вторых, если нет какой-либо причины, которая не очевидна дляБаза данных, которая сравнивает много исторических данных, вы должны использовать таблицу ISAM, а не InnoDB.
В-третьих, код_скрипта должен быть проиндексирован, иначе вы будете выполнять полное сканирование таблицы.
Подробнее: * Ваш оператор соединения в методе 2 объединяет каждую строку с каждой строкой и затем выполняет оператор where.Вы должны оставить левое соединение с rownum> t1.rownum-50 и rownum <= t1.rownum, вместо того, чтобы делать общее соединение и затем запускать where.Это значительно ускорит запрос даже без индексации rownum.* Если вы ожидаете намного больше данных, вам также следует изучить разбиение таблицы на основе rownum.Разделы могут быть превосходными для ускорения такого рода операций чтения, когда большая часть данных, к которым вы обращаетесь, является последовательной и попадает в один или два раздела.В вашем случае вы также можете разделить по дате, что может быть полезно для других операций.* Посмотрите на EXPLAIN SELECT и посмотрите, какие ключи используются в соединениях.Рассмотрим подсказку USE INDEX для использования rownum вместо первичного ключа для объединения. </p>
По-видимому, ни один из ваших запросов неверен.После того, как вы выполнили вышеуказанные оптимизации, я предполагаю, что ваш метод-1 (подзапрос) все равно будет работать быстрее, чем правильный JOIN ON без WHERE в методе-2.
В этот момент вы должны использовать EXPLAIN SELECT, чтобы увидеть, что делается в каждом запросе.Он покажет вам, сколько строк читается и объединяется, и какие индексы используются, помогая вам сузить любые проблемы с неиндексированными объединениями.