Повторіть запитання, задане на Stack Overflow, коли було запропоновано, це буде кращим форумом.
Я намагаюся трохи експериментувати над тим, щоб натиснути набір даних, який не є геопросторовим, але він цілком відповідає, і я вважаю результати дещо неспокійними. Набір даних є геномними даними, наприклад, Геном людини, де ми маємо область ДНК, де такі елементи, як гени, займають конкретні координати початку та зупинки (наша вісь X). У нас є кілька областей ДНК (хромосом), які займають вісь Y. Мета полягає в тому, щоб повернути всі елементи, які перетинають дві координати X вздовж однієї координати Y, наприклад LineString (START 1, END 2).
Теорія здалася здоровою, тому я втілив її в існуючий проект геному на MySQL і створив структуру таблиці на зразок:
CREATE TABLE `spatial_feature` (
`spatial_feature_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`external_id` int(10) unsigned NOT NULL,
`external_type` int(3) unsigned NOT NULL,
`location` geometry NOT NULL,
PRIMARY KEY (`spatial_feature_id`),
SPATIAL KEY `sf_location_idx` (`location`)
) ENGINE=MyISAM;
external_id
представляє ідентифікатор сутності, яку ми закодували в цю таблицю, і external_type
кодує джерело цього. Все виглядало добре, і я зафіксував деякі попередні дані (30 000 рядків), які, здавалося, спрацювали добре. Коли цей показник збільшився за останні 3 мільйони міток рядка, MySQL відмовився від використання просторового індексу і був повільнішим, коли його змусили використовувати (40 секунд проти 5 секунд при повному скануванні таблиці). Коли було додано більше даних, почали використовувати індекс, але покарання за ефективність зберігається. Вимкнення індексу знизило запит до 8 секунд. Запит, який я використовую, виглядає так:
select count(*)
from spatial_feature
where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location);
Дані, що впадають у це, дуже щільні за розмірами Y (подумайте про це, як ви записали положення кожної будівлі, телефонної скриньки, поштової скриньки та голуба на дуже довгій дорозі). Я робив тести, як R-індекси поводяться з цими даними на Java, а також інші в цій галузі успішно застосовували їх до форматів плоских файлів. Однак ніхто не застосовував їх до баз даних AFAIK, що є метою цього тесту.
Хтось там бачив подібну поведінку, додаючи велику кількість даних до просторової моделі, яка не дуже розрізнена по певній осі? Проблема зберігається, якщо я скасую використання координат. Я виконую наступні налаштування, якщо це є причиною
- MacOS 10.6.6
- MySQL 5.1.46