我正在使用下面提到的查询,每个表中大约有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
我正在使用下面提到的查询,每个表中大约有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
几乎所有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
创建的关键指标,你通常compare..That将减少时间大大
首先你要确定你的表
网址键( 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
正在使用比=''更快的length()吗?如果你有空,会发生什么?一样? – haltabush 2012-03-21 07:35:49
@haltabush长度不是更快,但它处理空值 – silly 2012-03-21 07:46:11
然后“(urls.status IS NULL)或(urls.status ='')”应该更快... – user1027167 2012-03-21 08:02:12
首先,你应该更好地使用联接语法:
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条记录,我想它仍然有点慢。
不仅创造指数将解决所有的问题。 您可以优化您的表结构并删除冗余索引(如果有)。 我使用SQLyog它有'查询分析器',它会让你知道你的查询执行是如何发生的,查询执行的分步方法(典型布局将如下所示),还有'计算最佳数据类型'和'查找冗余索引'可以让你优化你的表格结构,我希望这个工具能帮助你。 )
请张贴您的表格创建语句! (看看你使用的引擎,你定义了什么样的键) – silly 2012-03-21 07:29:37