2012-04-22 2 views
0

Я создал таблицу:Как я могу ускорить запрос?

CREATE TABLE IF NOT EXISTS `markersStorage2` (
     `id` int(11) NOT NULL AUTO_INCREMENT, 
     `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL, 
     `surname` varchar(32) COLLATE utf8_unicode_ci NOT NULL, 
     `id_vk` int(10) NOT NULL, 
     `activity_link` varchar(128) COLLATE utf8_unicode_ci NOT NULL, 
     `message` varchar(256) COLLATE utf8_unicode_ci NOT NULL, 
     `lat` float(10,6) NOT NULL, 
     `lng` float(10,6) NOT NULL, 
     `type` varchar(32) COLLATE utf8_unicode_ci NOT NULL, 
     `id_tile` varchar(15) COLLATE utf8_unicode_ci NOT NULL, 
     PRIMARY KEY (`id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

Я использую его для хранения Google Maps маркеров плиток.

Эта таблица часто обновляется, я имею в виду, что новые маркеры добавляются в него

Я использую этот запрос, много:

SELECT id, lat,lng FROM markersStorage2 WHERE id_tile LIKE '$tileNumber%' 

Как я ускорить этот запрос? Может быть, мне нужно создать другую таблицу или реорганизовать эту?

плитки пронумерованы, как здесь:

http://msdn.microsoft.com/en-us/library/bb259689.aspx

Пример: Я использую максимальный масштаб 15, так что поэтому, когда я добавить новый маркер к БД сервера

определить, в котором плитка этот маркер будет располагаться, например, мы получим что-л, как этот

id_tile = 002013111032032 

Все маркеры не имеют id_tile с 15 номерами не меньше не больше.

Позже, когда пользователь взгляд через тайлов испрашивается через AJAX, но это плитки может

быть на разных уровнях масштабирования и, например, мы получим этот запрос:

 SELECT id, lat,lng FROM markersStorage2 WHERE id_tile LIKE '002013111032%' 

Таким образом, используя этот Я могу получить все маркеры в этой большой плитки.

+0

В чем состоит deos id_tile? Возможно, поле может быть разделено или что-то, чтобы избежать поиска по шаблону '%'? –

+0

'LIKE '$ tileNumber%''? что вы делаете? это не имеет большого смысла. –

+0

Я отредактировал вопрос, так что теперь я думаю, что это более понятно. – knightOfSpring

ответ

3

вам нужно поместить указатель на id_tile поле.

ALTER TABLE `markersstorage2` ADD INDEX `id_tile` (`id_tile`); 

Вы можете проверить, если ваш запрос использует индекс или не нравится:

EXPLAIN SELECT ID, широчайшие, СПГ- markersStorage2 ГДЕ id_tile НРАВИТСЯ '3%'

без индекса

«id»; «select_type»; «table»; «type»; «possible_keys»; «key»; «key_len»; «ref»; «rows»; «Extra» «1»; «SIMPLE»; "markersStorage2"; "ВСЕ"; NULL; NULL; NULL; NULL; "7", "Использование , где"

с индексом

"идентификатор", "SELECT_TYPE";» таблица "," type "," possible_keys "," key "," key_len "," ref "," rows ";" Extra " " 1 ";" SIMPLE "," markersStorage2 "," range ";" id_tile " ; «id_tile»; «47»; NULL; «3»; «Использование , где«

5

Попробуйте следующее:

ALTER TABLE `markersstorage2` ADD INDEX (`id_tile`) ; 
+2

Вам не нужны индексы для полей, которые необходимо выбрать. – MichaelRushton

+1

, и это неправильный порядок, поэтому совершенно бесполезно –

+0

, этот индекс никогда не будет использоваться с этим запросом. –

Смежные вопросы