Если вы заранее знаете некоторые ключевые критерии, которые будут иметь все поиски, MySQL (> = v5.1) разбиение таблицы может помочь.
Например, если у вас есть такая таблица:
create table Books(pubDate dateTime, title varchar(50));
И вы знаете, что во всех поисках должен быть хотя бы один год, вы можете разбить его на поле даты следующим образом:
create table Books(pubDate dateTime,title varchar(50)
partition by hash(year(pubDate)) partitions 10;
Затем, когда вы запускаете выборку для таблицы, если ваше предложение where включает критерии, ограничивающие раздел, в котором могут существовать результаты, поиск будет сканировать только этот раздел, а не полное сканирование таблицы. Вы можете увидеть это в действии с:
-- scans entire table
explain partitions select * from Books where title='%title%';
против чего-то вроде:
-- scans just one partition
explain partitions select * from Books
where year(pubDate)=2010
and title='%title%';
Документация по MySQL для этого довольно хорошая, и вы можете выбрать один из нескольких алгоритмов разбиения.
Даже если вы решите разбить дату, может помочь раздел таблицы, скажем, за год (int) (при условии, что поиск всегда будет указывать год).