我怎样才能加快查询速度?

时间:2012-04-22 16:03:39

标签: mysql google-maps database-design

我创建了一张桌子:

    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 

我用它来按瓷砖存储谷歌地图标记。

此表经常更新,我的意思是新标记添加到其中

我经常使用这个查询:

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

如何加快此查询?也许我需要创建另一个表或重新组织这个表?

瓷砖编号如下:

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

示例:我使用最大缩放15,因此当我向DB添加新标记时服务器

确定此标记位于哪个图块中,例如我们将像这样获得smth

    id_tile = 002013111032032

所有标记都有id_tile,15个数字不少于此。

稍后当用户通过ajax请求查看地图图块时,此图块可以

处于不同的缩放级别,例如我们会收到此请求:

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

因此,使用此请求,我可以获得此大块中的所有标记。

2 个答案:

答案 0 :(得分:5)

尝试以下方法:

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

答案 1 :(得分:3)

你需要在id_tile字段上放一个索引。

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

您可以检查您的查询是否使用索引:

  

解释SELECT id,lat,lng FROM markersStorage2 WHERE id_tile LIKE   ' 3%'

没有索引

  

" ID&#34 ;;" SELECT_TYPE&#34 ;;"表&#34 ;;"类型&#34 ;;" possible_keys&#34 ;;&# 34;键&#34 ;;" key_len&#34 ;;" REF&#34 ;;"行&#34 ;;"额外"   " 1&#34 ;;" SIMPLE&#34 ;;" markersStorage2&#34 ;;" ALL&#34 ;; NULL; NULL; NULL; NULL;" 7&# 34 ;;"使用   其中"

带索引的

  

" ID&#34 ;;" SELECT_TYPE&#34 ;;"表&#34 ;;"类型&#34 ;;" possible_keys&#34 ;;&# 34;键&#34 ;;" key_len&#34 ;;" REF&#34 ;;"行&#34 ;;"额外"   " 1&#34 ;;" SIMPLE&#34 ;;" markersStorage2&#34 ;;"范围&#34 ;;" id_tile&#34 ;;" id_tile& #34 ;;" 47&#34 ;; NULL;" 3&#34 ;;"使用   其中"