[英]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
我使用 SQL_CALC_FOUND_ROWS 因为我想显示总匹配结果。 我在页面上只显示 50 个项目 (LIMIT 0, 50)。
当我执行该查询时,我的 php 页面需要大约 5 秒才能加载(没有查询时不到 1 秒)。
您可以通过执行以下操作在 items.code 上创建索引:
CREATE INDEX idx_items_code ON items (code);
它应该可以提高您的查询即时性。
我的建议是通过阅读stackoverflow.com上的一些帖子来了解索引是如何工作的。
这是一个很好的:SQL 服务器中的索引是什么?
编辑:
如果索引那么好,我可以在每个字段上创建索引。 使用索引的后果是什么?
实际上,索引是灵丹妙药。 它每次都有效。 太长的查询,繁荣,做一个索引。 这就是为什么在您创建主键时,MySQL 会向该字段添加索引。
另一方面,索引在服务器上占用空间,而其他操作:删除、更新、插入,将花费更多时间。
所以如果你不经常删除、更新或插入,select 很多的话,你几乎可以为每个字段创建一个索引。
最好是对索引的使用了解的太透彻,这样才能做出不错的选择。
在cat
表上为字段iid
创建索引
在您的items
表上为字段code, iid, expire
或iid, 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.