Как другие уже говорил, - скорее всего, два объяснения:
Это занимает много времени для 30000 записей для чтения, передаются, обрабатываются и поместить в массив. (Вероятно, вы также увидите довольно большой объем памяти, который пережевывается PHP ...)
Там что-то отсутствует.
Отсутствие индексов можно идентифицировать с помощью EXPLAIN
. Я не буду вдаваться в подробности здесь, вы можете Google it. Сначала я дважды проверяю наличие соответствующих индексов на JOIN
.
Но ваш запрос на самом деле очень простой. Таким образом, гораздо более вероятным является «воспринимаемая» продолжительность запроса. MySQL достаточно долго читает все эти записи, помещает их в память, форматирует их, доставляет их по стеку TCP/IP, получает PHP, обрабатывает их в массив и т. Д.
Рассмотрите (как уже говорили другие) с помощью предложения LIMIT
, чтобы уменьшить количество возвращенных записей. (Индексированный первичный ключ ORDER BY
гарантирует, что вы всегда получите те же результаты для заданного LIMIT
.)
Наконец-то (но я подозреваю, что это самый низкий уровень вероятности): мы не можем видеть структуры таблицы. Они очень широкие? Возможно, BLOB
или TEXT
полей внутри? Если предположить, что средняя запись велика (скажем, 2 КБ), то 30 000 записей будут 58 МБ данных. Возможно, было бы целесообразно кэшировать некоторые более крупные данные поиска в PHP в первую очередь.
Мне также приходит в голову, что вы можете застрять в общем колесе решения проблемы, которая не существует.
Вы возвращаетесь всех, но вы на самом деле с помощью все в коде, который следует? (Вы уже сказали, что вам нужно всего ~ 300 рядов за раз.)
Я работал над некоторыми серьезными большими базами данных (как я уверен, другие люди, отвечающие тоже) - иногда это проблема, которая должна изменение, а не решение.
Нормализация в базах данных является академически хорошей, но на самом деле может быть очень плохой. Не бойтесь дублировать данные для эффективного, суммированного кеша. Рассмотрите возможность изменения проблемы, чтобы было меньше данных. Принуждение обновлений и удалений с помощью безопасных для транзакций хранимых процедур позволяет вам иметь лучшее из обоих миров.
Зачем вам нужно использовать -> select(), если вы можете делать Игры :: где ('id', $ id) -> get() -> toArray(); –
@JohnRoca Извините, я часто не использую -> select(). Я просто выбираю(), когда хочу выделить какое-то поле в таблице. Вопрос обновлен –
Почему вы возвращаете 30000 строк, это настоящий вопрос? – Ohgodwhy