2012-03-21 79 views
1

我正在使用下面提到的查询,每个表中大约有400,000条记录,大约需要10〜12秒才能显示结果。有什么办法可以让它更快。如何快速查询

查询:

select url_details.title, url_details.summary, url_details.id from urls, 
url_details where urls.status='' AND urls.keyword_id='2791' AND 
url_details.url_id=urls.id 
+0

请张贴您的表格创建语句! (看看你使用的引擎,你定义了什么样的键) – silly 2012-03-21 07:29:37

回答

0

几乎所有mysql性能问题的答案都是索引。 如果您知道您将针对所有查询筛选这三个变量,请添加跨越这三个字段的复杂索引。

http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

如果你不知道哪些索引,就会被过滤,然后添加一个简单的指数为每个字段,并依靠MySQL的“指数合并”的优化。

http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

+0

非常感谢,它帮助了很多。之前的查询花费了大约8〜12秒,但并没有降到0.00秒。谢谢大家:) – Prashant 2012-03-27 06:17:45

+0

@Prashant:我对什么解决了你的问题感兴趣。 – bukzor 2012-03-27 15:54:51

+0

添加索引标题和摘要做了工作 – Prashant 2013-04-03 09:01:33

1

创建的关键指标,你通常compare..That将减少时间大大

0

首先你要确定你的表

网址键( habe用状态和keyword_id定义索引):

ALTER TABLE `urls` ADD INDEX `index_keyword_status`(`keyword_id`, `status`); 

和urls_details.url_id必须是一个外键或索引

您的选择:

SELECT 
url_details.title, 
url_details.summary, 
url_details.id 
FROM urls 
INNER JOIN url_details 
    ON url_details.url_id=urls.id 
WHERE urls.keyword_id = 279 
    AND LENGTH(urls.status) = 0 
+0

正在使用比=''更快的length()吗?如果你有空,会发生什么?一样? – haltabush 2012-03-21 07:35:49

+0

@haltabush长度不是更快,但它处理空值 – silly 2012-03-21 07:46:11

+0

然后“(urls.status IS NULL)或(urls.status ='')”应该更快... – user1027167 2012-03-21 08:02:12

0

首先,你应该更好地使用联接语法:

select url_details.title, url_details.summary, url_details.id from urls join urls_details using(url_id) where urls.status='' AND urls.keyword_id='2791' 

你还需要有萨姆urls.status上的索引,url_id和keyword_id。 如果你在每张桌子上有4 000 000条记录,我想它仍然有点慢。

0

不仅创造指数将解决所有的问题。 您可以优化您的表结构并删除冗余索引(如果有)。 我使用SQLyog它有'查询分析器',它会让你知道你的查询执行是如何发生的,查询执行的分步方法(典型布局将如下所示),还有'计算最佳数据类型'和'查找冗余索引'可以让你优化你的表格结构,我希望这个工具能帮助你。 enter image description here