表中有超过1200万行在性能问题上运行

时间:2011-10-07 21:51:59

标签: php mysql performance myisam

现在这个有问题的表实际上是一个关系表,用于关键字分析网站,其中有五列(keyword_idwebsite_idoccurrencepercentagedate

这允许在一段时间内为网站提供关键字统计信息,并允许向网站所有者显示可视图形。

现在问题是我们平均每个网站索引约57个唯一关键字。我们每天索引大约12000个网站,这是因为我们已经遇到了性能问题。因此,您可以了解到此表的大小正在快速增长。

现在我有keyword_idwebsite idoccurrencepercentagedate的索引。所以每个人都有一个索引,但我仍然遇到选择问题。

如何用PHP解决mysql上的这个性能问题?

NOTE: The indexes are for each field and 1 for all of them combined as well.

SQL QUERY 1: SELECT * FROM table WHERE keyword_id = "323242"
SQL QUERY 2: SELECT * FROM table WHERE website_id = "232"
SQL QUERY 3: SELECT * FROM table WHERE keyword_id = "323242" ORDER by percentage
SQL QUERY 4: SELECT * FROM table WHERE website_id = "232" ORDER by occurence
SQL QUERY 5: SELECT * FROM table WHERE keyword_id = "323242" ORDER by occurrence
SQL QUERY 6: SELECT * FROM table WHERE website_id = "232" ORDER BY date

1 个答案:

答案 0 :(得分:4)

关键字的分布和概率是多少?例如,如果每个站点都使用了一个关键字,那么每天,在6 mos之后,对于一个关键词来说,这是2.1M行。我确信情况并非如此,但流行的话语会很快变大。

website_id应该不会太糟糕,只有几千行。

如果你只是通过keyword_id和website_id进行查询,那么其他索引会耗费你的时间和空间(但不会在读取时)。

理想情况下,关键字_id,百分比的索引会让优化器为您的keyword_id返回一个相当快的结果,按百分比查询排序,类似于其他查询,但这可能取决于很多数据的布局。

盒子上有多少内存,驱动器有多快?当你进行这些查询时,我会查看每秒的IO Ops。您可以轻松地将您的驱动器捶打。

具有相当大的内存量,order by子句应该相当便宜,并且可能更便宜地对它们进行排序而不是从磁盘中进行大量随机读取,但这取决于索引及其与页面相关的组织方式在磁盘上。

另外,请确保您的所有统计信息都是最新的。错误的统计数据会谋杀你的查询。