Что такое индекс:
Думайте о таблице базы данных как о библиотеке - у вас есть большая коллекция книг (записей), каждая из которых связана с данными (имя автора, издатель, дата публикации, ISBN, контент). Также предположим, что это очень наивная библиотека, где все книги упорядочены по порядку ISBN (первичный ключ). Так же, как книги могут иметь только один физический порядок, таблица базы данных может иметь только один индекс первичного ключа.
Теперь представьте, что кто-то приходит к библиотекарю (программа базы данных) и говорит: «Я хотел бы знать, сколько книг Норы Робертс находится в библиотеке». Чтобы ответить на этот вопрос, библиотекарь должен пройти по проходам и посмотреть на каждую книгу в библиотеке, что очень медленно. Если библиотекарь получает много подобных запросов, стоит потратить время на создание карточного каталога по имени автора (указатель на имя) - тогда он сможет гораздо быстрее ответить на такие вопросы, обратившись к каталогу вместо того, чтобы ходить по полкам. По сути, индекс устанавливает «альтернативный порядок» книг - он обрабатывает их так, как если бы они были отсортированы по алфавиту по авторам.
Обратите внимание, что 1) для установки каталога требуется время, 2) каталог занимает дополнительное место в библиотеке, и 3) он усложняет процесс добавления книги в библиотеку - вместо того, чтобы просто прикрепить книгу к Полка в порядке, библиотекарь также должен заполнить учетную карточку и добавить ее в каталог. Точно так же добавление индекса в поле базы данных может ускорить ваши запросы, но сам индекс занимает место для хранения и замедляет вставки. По этой причине вы должны создавать индексы только в ответ на потребность - нет смысла индексировать поле, по которому вы редко выполняете поиск.
Что такое кэширование:
Если у библиотекаря много людей, которые приходят и задают одни и те же вопросы снова и снова, возможно, стоит потратить свое время, чтобы записать ответ на стойке регистрации. Вместо проверки стеков или каталога он может просто сказать: «Вот ответ, который я дал последнему, кто задал этот вопрос».
В вашем сценарии это может применяться по-разному. Вы можете сохранить результаты запроса к базе данных или вычисления или части отображаемой веб-страницы; Вы можете сохранить его во вторичной таблице базы данных или в файле или в переменной сеанса или в службе памяти, такой как memcached. Вы можете сохранить предварительно проанализированный запрос к базе данных, готовый к запуску. Некоторые библиотеки, такие как Smarty, автоматически сохранят часть или всю страницу за вас. Сохраняя результат и используя его повторно, вы можете избежать выполнения одной и той же работы много раз.
В каждом случае вам нужно беспокоиться о том, как долго ответ останется в силе. Что делать, если в библиотеке появилась новая книга? Можно ли использовать ответ, который может быть устаревшим на пять минут? А как насчет дня устаревшего?
Кэширование очень специфично для приложения; вам придется подумать о том, что означают ваши данные, как часто они меняются, насколько дорогостоящий расчет, как часто требуется результат. Если данные изменяются медленно, может быть лучше пересчитать и сохранить результат при каждом изменении; если он часто изменяется, но не имеет решающего значения, его может быть достаточно для обновления, только если значение в кэше превышает определенный возраст.