Php MySQL选择查询与连接和大量结果优化

Php MySQL选择查询与连接和大量结果优化,php,mysql,optimization,query-optimization,Php,Mysql,Optimization,Query Optimization,我有两张桌子。第一个包含所有项目信息,第二个包含带有类别ID的项目ID。原因是一个项目可以位于多个类别中。我桌上有大约50万件物品 下面是一个select查询示例: 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.cod

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

下面是一个select查询示例:

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
  • 代码=我仅用于搜索的代码
  • expire=某个应用程序的过期时间 项目
我使用SQL\u CALC\u FOUND\u行,因为我想显示全部匹配结果。我在页面上只显示50个项目(限制为0,50)

当我执行该查询时,我的php页面大约需要5秒钟才能加载(如果没有查询,则不到1秒钟)

  • 有没有办法优化它
  • 使用SQL\u CALC\u FOUND\u行或带有SELECT COUNT(*)的第二个查询是否更快
  • 我听说过索引,但我不知道如何使用它们以及它们做什么。他们能帮忙吗
  • 是的,你可以,通过使用索引
  • 最好使用2查询,请参见此处: 在这里:
  • 索引帮助MySQL更快地查找数据。在这里,您需要一个关于代码、cid、expire和price的索引
  • 通过执行以下操作,可以在items.code上创建索引:

    CREATE INDEX idx_items_code ON items (code);
    
    这将提高您的查询的即时性

    我的建议是通过阅读一些文章来了解索引是如何工作的

    这里有一个很好的例子:

    编辑:


    如果索引有那么好,我可以创建 每个字段上的索引。有什么问题 使用索引的后果

    实际上,索引是一颗银弹。每次都有效。太长的查询、爆炸、创建索引。这就是为什么在创建主键时,MySQL会向字段添加索引

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

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


    最好的办法是充分了解索引的使用,这样你就可以做出正确的选择。

    cat
    表上为字段
    iid


    code,iid,expire
    iid,code,expire
    字段在
    items
    表中创建索引。看看哪个最快


    您可以使用select前面的
    EXPLAIN
    ,获取有关如何优化select的信息

    如果不在数据库上进行任何选择,页面的加载速度总是会更快

    我认为你的问题是关于你的页面被服务的时间长度,而不是功能的具体使用

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

    还有什么脚本正在发生?您正在处理结果吗?脚本是否已优化


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

    这两个表上有哪些索引?请发布(在问题中添加表的定义)。如果索引有那么好,我可以在每个字段上创建索引。使用索引的后果是什么?在大多数情况下,一个或两个设计良好的索引将比散点枪方法更有效。