У нас есть большая (и постоянно растущая) база данных MySQL записей о птицах. В настоящее время у нас есть три основные таблицы, которые в упрощенном виде выглядят следующим образом:
RECORDS (id, birdid, tripid, gender, age) PRIMARY KEY id
BIRDTRIPS (id, locid, date, starttime, endtime, notes) PRIMARY KEY id
LOCATIONS (id, description, centerlat, centerlng) PRIMARY KEY id
Все идентификаторы имеют тип INT, а дата - тип DATE.
Для повышения производительности я решил сделать некоторую денормализацию, реплицируя дату и локид в ЗАПИСИ:
RECORDS (id, birdid, tripid, gender, age, locid, date) PRIMARY KEY id
Таким образом, многие запросы позволят избежать дорогостоящих соединений с BIRDTRIPS и LOCATIONS.
MySQL имеет только один кластеризованный индекс для каждой таблицы, и это всегда первичный ключ. Я хочу попробовать PRIMARY KEY (date, id)
на RECORDS, чтобы использовать кластеризованный индекс для более быстрого сканирования диапазона в столбце даты и разделения таблицы. Идентификатор включается в ключ только потому, что на одну дату может быть много записей. Теоретически первичный ключ часто «тратится впустую» для идентификатора, где некластеризованный индекс UNIQUE будет достаточным для поиска.
А теперь мой вопрос:
Есть ли у кого-нибудь из вас практический опыт использования этого подхода? Есть ли недостатки, которые я мог упустить?