【问题标题】:PHP and MySQL: optimize databasePHP 和 MySQL:优化数据库
【发布时间】:2011-01-23 19:17:06
【问题描述】:

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

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

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

我最终会适当地缩减数据库,但有没有快速的临时解决方案?

【问题讨论】:

  • 可能问题出在查询...可能是服务器硬件不够强大,我想我们需要更多信息。
  • 有没有办法改进简单的选择查询?查询字面意思是“SELECT * FROM table WHERE column="something"”。硬件方面,也许吧,但是服务器没有以最大容量运行,所以我不确定是否是这样,虽然显然更好的硬件会更好:-D
  • 对查询使用 EXPLAIN 以了解数据库服务器如何执行它们。使用此信息,您可以创建所需的索引。 10M的记录不算多,应该不会出大问题。除非它们每个都是 1GB... ;)
  • 我在 0.5 秒内对超过 1 亿行运行了复杂的查询,但我有一个设计合理的数据库,它利用了 innodb 聚集索引、二级索引、非规范化、汇总表、正确的数据类型(tinyint unsigned 1byte vs int无符号 4 字节)、正确的 mysql 配置和许多其他优化。 (根据我的经验,分区减慢了我的性能)1000 万并不像 Frank Heikens 上面所说的那样 - 向我们展示您的疑问并解释计划,以便我们进一步发表评论。

标签: php mysql optimization


【解决方案1】:

在您经常搜索的列上使用索引。

【讨论】:

  • 已经在做这个了!有没有一种“更好”的具体方法?现在我有最活跃的搜索(例如:WHERE x = y,其中 x 是我索引的列)列索引。
【解决方案2】:

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

第一步(也是最简单的)将确保您的查询得到优化。

【讨论】:

  • 我刚刚运行了“ANALYZE TABLE”来了解更多信息,但对基本查询的解释给出了:pastebin.com/MfNEiqBy
【解决方案3】:

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

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 并提高数据库的性能。

这里的一些其他链接可能对您有所帮助:

【讨论】:

    【解决方案4】:

    在您的示例中,'WHERE x=y',如果 y 是列名,则也使用 y 创建索引。

    带有索引的键是您的选择查询的结果数,与整个表相比应该在 3% ~ 5% 左右,并且会更快。

    归档表格也有帮助。我不知道该怎么做,主要是 DBA 任务。 对于 DBA 来说,如果他们一直在这样做,那就很简单了。

    【讨论】:

      【解决方案5】:

      我可以看到您从数据库请求 40k 行,这个数据负载需要时间来传输。

      另外,永远不要问“总体上如何改进”。没有“一般”优化的方法。优化始终是对您的特定案例进行分析和研究的结果。

      【讨论】:

        【解决方案6】:

        如果您正在执行排序或复杂查询,您可能需要使用多列索引。例如,如果您正在搜索 where x.name = 'y' OR x.phone = 'z' 可能值得在 name,phone 上放置一个索引。简化的示例,但是如果您需要这样做,无论如何您都需要进一步研究它:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-20
          • 2010-12-12
          • 1970-01-01
          • 2015-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多