2012-08-04 24 views
1

我使用的MySQL [InnoDB引擎]指数,但查询响应仍然很慢(高响应时间):MySQL的:使用索引,但仍然十分缓慢

我在这里学习Full Text Search In MySql

我们无法在Mysql的默认innoDB存储引擎表上实现。

我创建了一个自动提示用户哪里型名字,那么我的查询获取City, Country名称格式。

$search = $_GET['term']; 
mysql_query("CREATE INDEX index_plc ON projects(pro_loc_city)"); 
$result = mysql_query("SELECT CONCAT_WS(', ', p.pro_loc_city, c.country_name) 
         as location FROM projects p 
        LEFT JOIN countries c ON c.country_id = p.country_id 
        WHERE p.pro_loc_city LIKE '%$search%' 
        GROUP BY p.country_id") or die('Something went wrong'); 
mysql_query("DROP INDEX index_plc ON projects"); 

在萤火虫中,响应时间约为5到3秒。

enter image description here

项目表

---------------------------------- 
pro_id | pro_loc_city | country_id 
---------------------------------- 
    1  Karachi   50 
    2  Lahore   60 
    3  Karachi   50 
    4  Abc    70 
    5  Karachi   50 

国家

------------------------- 
country_id | country_name 
------------------------- 
    50   Pakistan 
    60   A Country 
    70   B Country 

这是萤火虫说什么。

enter image description here

请指导我什么,我做错了。

+2

在大型表上创建索引是一项昂贵的操作。在大多数情况下,索引是留在那里的。创建一个,执行一个查询并将其删除 - 无助于速度。尝试创建索引,留下并重新查询:) – favoretti 2012-08-04 15:59:35

+0

在萤火虫?解释计划怎么样? – Samson 2012-08-04 15:59:36

+0

@favoretti:你的评论应该是一个答案。 – 2012-08-04 16:10:42

回答

3

在大表上创建索引是一项昂贵的操作。在大多数情况下,索引是留在那里的。创建一个,执行一个查询并将其删除 - 无助于速度。尝试创建索引,留下并重新查询:)

+0

嗯,我也只创建INDEX一次,删除INDEX的DROP查询,但它仍然非常缓慢,请在这里重新检查我的问题,我添加Firebug响应,一段时间需要22秒。请引导准确的查询。谢谢 – 2012-08-04 17:11:46

+1

@PHPFerrari你的问题是'p.pro_loc_city LIKE'%$ search%''。 MySQL只能使用'LIKE'值'或LIKE'值'%'的索引。它不能使用一个完整的子字符串搜索。您的选择是搜索以$ search开头的城市('LIKE'$ search%''),或者创建[FULLTEXT](https://dev.mysql.com/doc/refman/5.5/en /fulltext-search.html)索引并做一个“完整的单词”或一个“以xxx开头的单词”搜索。 – Vatev 2012-08-04 17:17:10

+0

@Vatev好友城市名称在Projects表中,并且国家名称在国家/地区表中,因此查询字符串如“巴基斯坦卡拉奇”的查询是什么。还有一件事我使用InnoDB 请帮助我。 – 2012-08-04 18:02:40

相关问题