Bir dizini "içindekiler tablosu" olarak düşünün ... bu, sıralı bir dosyadaki konum işaretçilerinin bir listesidir, yani ofsetler. Tabloda eşleşen milyonlarca kaydın bulunduğunu, tabloda eşleşen ölçütler için arama yapmak yerine, eşleşmeler için sıralı bir listeye başvurmanın çok daha hızlı olduğunu, ardından işaretçileri belirli eşleşen satırlara yığınladığını söyleyin. Mükemmel bir dizin örneği, tabloların birincil anahtar alanını, en çok da "id" alanını belirtir. Satır kimliği # 11234566 istiyorsanız, dizinden veri işaretçisini 11234566 konumu için veri kaynağını taramaktan çok daha hızlı isteyin.
İşte endekslemenin çok açık bir kullanımı:
CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);
İşleminiz, günlük kaydınızı oluşturabilir, ancak daha sonra aramak / sıralamak için, günlük tablonuzdan daha hızlı olan indekslenmiş bir tarih saatine referans oluşturur. Ardından log tablonuzu kendi ana anahtarında birleştirin. Bu konuyu genişletmeme ihtiyacın olursa haberim olsun. Umarım bu mantıklı gelir.
Örnek sorgu:
SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';