MySQL选择带连接的查询和大量结果优化

时间:2011-06-14 14:46:05

标签: php mysql optimization query-optimization

我有两张桌子。第一个包含所有项目信息,第二个包含具有类别ID的项目ID。原因是因为一个项目可以在多个类别中。我桌上有大约50万件物品。

这是一个选择查询例子:

SELECT SQL_CALC_FOUND_ROWS items.* 
FROM items 
    INNER JOIN cat
        ON items.iid=cat.iid 
WHERE (items.expire>'1308061323' AND cat.cid = '1') 
AND (items.code=71 OR items.code=23) 
ORDER BY price DESC 
LIMIT 0, 50
  • iid =商品ID
  • cid =类别ID
  • code =我用于搜索的代码。
  • expire =一个到期时间 项目

我使用SQL_CALC_FOUND_ROWS,因为我想显示总匹配结果。我在页面上只显示50个项目(LIMIT 0,50)。

当我执行该查询时,我的php页面加载大约需要5秒钟(没有查询时少于1秒)。

  • 有优化方法吗?
  • 使用SQL_CALC_FOUND_ROWS或使用SELECT COUNT(*)的第二个查询是否更快?
  • 我听说过索引,但我不知道如何使用它们以及它们的用途。他们可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

  1. 是的,您可以使用索引。
  2. 最好使用2个查询,请看这里: Is there an effect on the speed of a query when using SQL_CALC_FOUND_ROWS in MySQL?和此处:To SQL_CALC_FOUND_ROWS or not to SQL_CALC_FOUND_ROWS?
  3. 索引可帮助MySQL更快地查找数据。在这里,您需要有关代码,cid,expire和price的索引。
  4. 您可以通过执行以下命令在items.code上创建索引:

    CREATE INDEX idx_items_code ON items (code);
    

    它应该可以改善您的查询直接性。

    我的建议是通过阅读stackoverflow.com上的一些帖子来了解索引是如何工作的。

    这是一个很好的:What is an index in SQL Server?

    编辑:

      

    如果索引那么好,我可以创建   每个领域的索引。什么是   使用索引的后果?

    实际上,指数是一颗银弹。它每次都有效。太长的查询,繁荣,做一个索引。这就是为什么当你创建一个主键时,MySQL会在该字段中添加一个索引。

    另一方面,索引在服务器上占用空间,而另一个操作:删除,更新,插入,将花费更多时间。

    因此,如果您不经常删除,更新或插入,并选择很多,您几乎可以为每个字段创建一个索引。

    最好的是完全理解索引的使用,所以你可以做出很好的选择。

答案 1 :(得分:1)

cat表格中为字段iid

创建索引

items表格上为字段code, iid, expireiid, code, expire创建索引。看哪个是最快的。

您可以在选择前使用EXPLAIN来获取有关如何优化选择的信息。 http://dev.mysql.com/doc/refman/5.0/en/explain-output.html

答案 2 :(得分:0)

如果您没有对数据库进行任何选择,您的页面将始终加载更快。

我认为您的问题是关于您的网页服务时间长度的问题,而不是该功能的具体用途。

您是否尝试在SQL之前和之后设置时间戳,以确定所需的确切时间。您说您将结果集限制为50行,但实际传输到您页面的数据量是多少?

还有哪些脚本正在发生?您正在处理结果并且该脚本是否已优化?

我以为我会列出一些你应该看的其他东西。