我有两张桌子。第一个包含所有项目信息,第二个包含具有类别ID的项目ID。原因是因为一个项目可以在多个类别中。我桌上有大约50万件物品。
这是一个选择查询例子:
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秒)。
答案 0 :(得分:3)
您可以通过执行以下命令在items.code上创建索引:
CREATE INDEX idx_items_code ON items (code);
它应该可以改善您的查询直接性。
我的建议是通过阅读stackoverflow.com上的一些帖子来了解索引是如何工作的。
这是一个很好的:What is an index in SQL Server?
编辑:
如果索引那么好,我可以创建 每个领域的索引。什么是 使用索引的后果?
实际上,指数是一颗银弹。它每次都有效。太长的查询,繁荣,做一个索引。这就是为什么当你创建一个主键时,MySQL会在该字段中添加一个索引。
另一方面,索引在服务器上占用空间,而另一个操作:删除,更新,插入,将花费更多时间。
因此,如果您不经常删除,更新或插入,并选择很多,您几乎可以为每个字段创建一个索引。
最好的是完全理解索引的使用,所以你可以做出很好的选择。
答案 1 :(得分:1)
在cat
表格中为字段iid
在items
表格上为字段code, iid, expire
或iid, code, expire
创建索引。看哪个是最快的。
您可以在选择前使用EXPLAIN
来获取有关如何优化选择的信息。 http://dev.mysql.com/doc/refman/5.0/en/explain-output.html
答案 2 :(得分:0)
如果您没有对数据库进行任何选择,您的页面将始终加载更快。
我认为您的问题是关于您的网页服务时间长度的问题,而不是该功能的具体用途。
您是否尝试在SQL之前和之后设置时间戳,以确定所需的确切时间。您说您将结果集限制为50行,但实际传输到您页面的数据量是多少?
还有哪些脚本正在发生?您正在处理结果并且该脚本是否已优化?
我以为我会列出一些你应该看的其他东西。