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, expire
或iid, code, expire
创建索引。看看哪个最快。
您可以在选择前面使用EXPLAIN
来获取有关如何优化选择的信息。 http://dev.mysql.com/doc/refman/5.0/en/explain-output.html
【讨论】:
【参考方案3】:如果您不对数据库进行任何选择,您的页面将始终加载得更快。
我认为您的问题是关于服务页面的时间长度而不是功能的具体用途。
您是否尝试过在 SQL 之前和之后设置时间戳,以确定它所花费的确切时间。您说您将结果集限制为 50 行,但是您实际将多少数据传输到您的页面?
还有什么其他的脚本正在发生?您是否正在处理结果并且该脚本是否已优化?
只是想我会列出一些您也应该查看的其他内容。
【讨论】:
以上是关于MySQL 选择查询与连接和大量的结果优化的主要内容,如果未能解决你的问题,请参考以下文章