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

Posted

技术标签:

【中文标题】MySQL 选择查询与连接和大量的结果优化【英文标题】:MySQL select query with join and a lot of results optimization 【发布时间】:2011-09-14 18:44:57 【问题描述】:

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

这是一个选择查询示例:

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(*) 进行第二个查询更快? 我听说过索引,但我不知道如何使用它们以及它们的作用。他们能帮忙吗?

【问题讨论】:

两张表有什么索引?请张贴(在问题中添加表格的定义)。 【参考方案1】:
    是的,您可以使用索引。 最好使用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? 索引帮助 MySQL 更快地查找数据。在这里,您需要一个关于代码、cid、过期和价格的索引。

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

CREATE INDEX idx_items_code ON items (code);

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

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

这是一个不错的选择:What is an index in SQL Server?

编辑:

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

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

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

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

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

【讨论】:

如果索引那么好,我可以在每个字段上创建索引。使用索引的后果是什么? 一两个设计良好的索引在大多数情况下会比散弹枪方法更有效。【参考方案2】:

cat 表上为字段iid 创建索引

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

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

【讨论】:

【参考方案3】:

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

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

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

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

只是想我会列出一些您也应该查看的其他内容。

【讨论】:

以上是关于MySQL 选择查询与连接和大量的结果优化的主要内容,如果未能解决你的问题,请参考以下文章

mysql对于大量数据,怎么进行优化

优化返回大量记录的查询,避免数百个连接。这是一个聪明的解决方案吗?

Mysql优化方法

Mysql优化

优化 SQL 查询以从大量 MySQL 数据库中获取数据

优化具有大量数据的MYSQL查询