如何解决MySQL选择具有连接的查询并优化了很多结果
| 我有两张桌子。第一个包含所有项目信息,第二个包含具有类别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
代码=我仅用于搜索的代码。
expire =的到期时间
项目
我使用sql_CALC_FOUND_ROWS,因为我想显示总的匹配结果。我在页面上仅显示50个项目(LIMIT 0、50)。
当我执行该查询时,我的PHP页面需要大约5秒钟的加载时间(如果没有查询,则少于1秒)。
有没有优化的方法?
使用sql_CALC_FOUND_ROWS或带有SELECT COUNT(*)的第二个查询是否更快?
我听说过索引,但是我不知道如何使用索引以及它们的作用。他们可以帮忙吗?
解决方法
是的,您可以使用索引。
最好使用2个查询,请参见此处:
在MySQL中使用SQL_CALC_FOUND_ROWS时,对查询速度有影响吗?而在这里:是SQL_CALC_FOUND_ROWS还是不是SQL_CALC_FOUND_ROWS?
索引可帮助MySQL更快地找到数据。在这里,您需要一个有关代码,cid,过期和价格的索引。
您可以通过执行以下命令在items.code上创建索引:
CREATE INDEX idx_items_code ON items (code);
它应该立即改善您的查询。
我的建议是通过阅读stackoverflow.com上的一些文章来了解索引的工作方式。
这是一个很好的例子:SQL Server中的索引是什么?
编辑:
如果索引那么好,我可以创建
每个字段的索引。什么是
使用索引的后果?
实际上,索引是灵丹妙药。它每次都有效。查询时间过长,繁荣,请建立索引。这就是为什么在创建主键时,MySQL向该字段添加索引的原因。
另一方面,索引占用了服务器上的空间,其他操作:删除,更新,插入将花费更多时间。
因此,如果您不经常删除,更新或插入并选择很多内容,则几乎可以为每个字段创建一个索引。
最好的办法是太全面地了解索引的使用,因此您可以做出很好的选择。
, 在cat
表格上为字段iid
创建索引
在items
表格上为字段code,iid,expire
或iid,code,expire
创建一个索引。看看哪个最快。
您可以在选择项前面使用ѭ7来获取有关如何优化选择项的信息。 http://dev.mysql.com/doc/refman/5.0/en/explain-output.html
, 如果您不对数据库进行任何选择,则页面的加载总是更快。
我认为您的问题与服务页面的时间长短有关,而不是功能的具体用途。
您是否尝试过在SQL之前和之后设置时间戳,以确定确切的时间。您说您将结果集限制为50行,但是实际传输到页面的数据量是多少?
还有什么其他脚本?您是否正在处理结果,并且脚本已优化?
只是以为我还会列出您应该考虑的其他一些内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。