繁体   English   中英

MySQL select 查询与连接和大量的结果优化

[英]MySQL select query with join and a lot of results optimization

我有两张桌子。 第一个包含所有项目信息,第二个包含项目 ID 和类别 ID。 原因是因为一个项目可以属于多个类别。 我的桌子上有大约 500 000 件物品。

这是一个 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_CALC_FOUND_ROWS 因为我想显示总匹配结果。 我在页面上只显示 50 个项目 (LIMIT 0, 50)。

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

  • 有没有办法优化它?
  • 使用 SQL_CALC_FOUND_ROWS 或使用 SELECT COUNT(*) 的第二个查询是否更快?
  • 我听说过索引,但我不知道如何使用它们以及它们的作用。 他们能帮忙吗?
  1. 是的,你可以,通过使用 index.
  2. 最好使用2查询,看这里: Is there an effect on a query of a query of a query when using SQL_CALC_FOUND_ROWS in MySQL? 在这里: 到 SQL_CALC_FOUND_ROWS 还是不到 SQL_CALC_FOUND_ROWS?
  3. 索引帮助 MySQL 更快地找到数据。 在这里,您需要一个关于代码、cid、过期和价格的索引。

您可以通过执行以下操作在 items.code 上创建索引:

CREATE INDEX idx_items_code ON items (code);

它应该可以提高您的查询即时性。

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

这是一个很好的:SQL 服务器中的索引是什么?

编辑:

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

实际上,索引是灵丹妙药。 它每次都有效。 太长的查询,繁荣,做一个索引。 这就是为什么在您创建主键时,MySQL 会向该字段添加索引。

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

所以如果你不经常删除、更新或插入,select 很多的话,你几乎可以为每个字段创建一个索引。

最好是对索引的使用了解的太透彻,这样才能做出不错的选择。

cat表上为字段iid创建索引

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

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

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

我认为您的问题是关于您的页面被提供的时间长度的担忧,而不是 function 的具体使用。

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

还有什么其他的脚本正在发生? 您是否正在处理结果并且该脚本是否已优化?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM