MySQL查询与服务器资源挂钩 - 未使用索引

时间:2014-08-05 17:19:58

标签: mysql joomla phpmyadmin

几年前我参加了一个志愿者项目。该网站是使用Joomla设置的,但大多数文章都是使用php脚本呈现的,这些脚本从非Joomla表中提取信息。数据库现在几乎是50MB,并且几个非Joomla表有60,000多行 - 我不知道它会变得如此之大。即使只是拉出包含这些脚本的文章列表也需要很长时间 - 现在只有大约30个。我最初认为这个问题是因为我在拨号上,所以一切都很慢,但后来我们开始得到资源超过"通知,所以我想我最好知道发生了什么。它不是一个高流量网站 - 我们在任何一个月内获得的访问者数量不到2,000。

在一个特定的例子中,我有一个表,其中图书馆馆藏(书籍等)按标题,作者,发布日期等列出。第二个表包含这些书中提到的名称。我有一个Joomla!每个出版物的文章,列出该书中的名称。我还有一篇文章列出了所有书籍中的所有名字。这是下面的查询 - 但即使是那些仅提取1000个左右条目的特定书籍的查询也非常慢。

我最初为这些表设置了索引(MyISAM),但是当我回去检查时,他们并没有。所以我认为重新配置索引可以解决问题。甚至没有 - 根据EXPLAIN,他们甚至没有被使用。

我的一个有问题的查询如下:

SELECT *
FROM pub_surnames
WHERE pub_surname_last REGEXP '^[A-B]'
ORDER BY pub_surname_last, pub_surname_first, pub_surname_middle

EXPLAIN给出了:

id 1
select_type SIMPLE
table pub_surnames
type ALL
possible_keys NULL
key NULL
key_len NULL
ref NULL
rows 56422
Extra Using where; Using filesort

此外,phpmyadmin说"当前选择不包含唯一列。"

此查询需要所有字段,但我在此处读到,如果我单独列出它们会有所帮助,所以我做了。该表包含一个主键,我添加了第二个唯一索引,其中包含表的主键,以及包含有关发布本身信息的表的主键。我还为ORDER BY字段添加了一个索引。但是当我使用EXPLAIN时,我仍然得到相同的结果,并且性能根本没有改善。

我在Joomla中设置了这些表格!该站点用于连接目的的数据库,它使得更容易备份所有内容。我现在想知道如果我为非Joomla表使用单独的数据库会有帮助吗?或者这会让情况变得更糟?

我不确定从哪里开始。

2 个答案:

答案 0 :(得分:1)

我认为你可能正以错误的方式接近这一点。当你第一次设置它时,它可能是快速完成它的方法,但现在数据已经增长,你付出了代价。

听起来你正在重新创建一个庞大的列表"内部"每次呈现页面时都有一篇文章。即使源数据不断更新,您最好还是存储结果。 (假设我正确地理解了你的数据结构。)不知道你的php脚本到底做了什么使得它有点复杂......实际上可以让一个非常简单的组件从其他表读取数据更有意义但我认为这没有意义。

以下是我认为您可能想要做的事情。 创建一个cron作业(使用Joomla很容易制作脚本,看看jacs存储库)并使用它来运行你正在做的任何事情。无论什么都有意义,你可以每天安排一次或每小时一次或每10分钟安排一次。

保存结果。这些可以进入数据库表,也可以将它们缓存在文件系统中。或两者。或者可能让脚本更新文章,因为它们似乎已修复(您不会添加新文章等)

然后,当用户到来时,您只想阅读文章,如果您存储在那里,或者您想拥有一个呈现结果的组件或创建一个将为您管理查询的插件。你不应该直接从文章布局中进行查询,这是错误的,即使没有人知道它。如果你必须运行查询,请使用类似于profile插件的内容插件,它可以在适当的位置进行体系结构查询。

不知道你正在做什么的确切目的,很难提出更多的建议,但我认为如果你正在管理人们的搜索,你可能会更好地创建一种方法来使用finder来查找索引并搜索结果。

答案 1 :(得分:0)

查看以下建议

  1. 尝试将数据库引擎更改为InnoDB,这样可以更好地处理大型数据集。

  2. 还使用RegEx替代方法,它在查询的“WHERE”部分中使用,这极大地影响了查询执行时间。

  3. 选择所有带“*”的列,只需选择所需的列。