2010-03-04 42 views
3

我有超过10,000,000行的数据库。现在查询它可能需要几秒钟才能找到一些基本信息。这是不可取的,我知道优化的最佳方法是尽量减少可能的行数,但现在我没有时间去做这件事。PHP和MySQL:优化数据库

什么是最简单的方法来优化MySQL数据库,以便查询时,所用的时间很短?

我不介意数据库的大小,这并不重要,所以任何增加大小的优化都可以。我对优化不太擅长,现在我已经建立了索引,但我不确定我能从那里得到多少好处。

我最终会适当减磅数据库,但有一个快速的治标不治本?

+0

也许问题是查询...也许这是服务器硬件不够porwerful,我认为我们需要更多的信息。 – 2010-03-04 17:57:23

+0

有没有办法改进简单的select查询?查询字面上是“SELECT * FROM table WHERE column =”something“”。硬件方面,也许,但服务器没有运行在最大容量下,所以我不确定是否是这样,虽然明显更好的硬件会更好:-D – sam 2010-03-04 18:09:39

+0

在您的查询中使用EXPLAIN来了解它们如何由您的数据库执行服务器。有了这些信息,你可以创建你需要的索引。 10M记录不是那么多,不应该给一个严重的问题。除非它们每个都是1GB ......) – 2010-03-04 18:52:23

回答

2

除了已经建议的索引之外,如果分区表很大,您可能还想查看它们。

Partitioning in MySQL

这很难具体在这里,因为我们有非常有限的信息,但分区沿着正确的索引可以走很远的路。正确编制索引可能是一个长期的主题,但从一般意义上讲,您需要索引您查询的列。

例如,假设您有员工表,并且您有常用的SSN,FNAME,LNAME列。除了这些列之外,我们还会说在表格中还有10列。

现在你有这个疑问:

SELECT FNAME, LNAME FROM EMPLOYEES WHERE SSN = 'blah'; 

忽略的事实SSN有可能成为主键在这里,可能已经有一个唯一的指标,你可能会看到一个性能优势通过创建另一个包含列(SSN,FNAME,LNAME)的组合索引。这是有益的原因是因为数据库可以通过查看组合索引来满足此查询,因为它包含排序和紧凑空间中所需的所有值。 (即更少的I/O)。即使SSN上的索引只是更好的全表扫描访问方法,数据库仍然必须读取索引(I/O)的数据块,找到将包含指向记录的指针的值需要满足查询,那么将需要读取不同的数据块(读取:更多的随机I/O),以便检索fname和lname的实际值。

这显然是非常简单的,但以这种方式使用索引可以大大减少I/O并提高数据库的性能。这里

一些其他环节可能对您有用:

1

上的列索引您搜索的非常频繁。

+0

已经这样做!有没有特定的方法可以做到“更好”?现在我有索引最活跃的搜索列(例如:WHERE x = y,其中x是我编入索引的列)。 – sam 2010-03-04 18:01:25

0

您的查询是否使用索引?在选择的查询上运行EXPLAIN会告诉你什么?

第一(和最简单的)一步将确保您的查询优化。

+0

我刚刚运行了“ANALYZE TABLE”来找出更多信息,但在基本查询中解释如下:http://pastebin.com/MfNEiqBy – sam 2010-03-04 18:02:19

1

在你的榜样,“WHERE x = y',如果y是列名,则也用y创建一个索引。

带索引的键是你的select查询的结果数应该比整个表大约3%〜5%,它会更快。

另外archieving表的帮助。我不知道如何做到这一点,主要是DBA的任务。 对于DBA来说,如果他们一直在做这件事,那么这很简单。

2

正如我所看到的,你从数据库中请求40k行,这个数据负载需要时间才能被传输。

此外,从来不问“如何改善一般”。没有“一般”优化的方法。优化总是对您的特定情况进行分析和研究的结果。

1

如果您要进行排序或复杂的查询,您可能需要使用多列索引。例如,如果您正在搜索x.name ='y'或x.phone ='z'的地方,可能需要在名称,电话上添加索引。简单的例子,但如果你需要这样做,你需要进一步研究:)